tag:blogger.com,1999:blog-63694183674116914472017-06-13T07:29:12.552-04:00Mike SubelskyI am a computer programmer and racounteur entrepreneur based in Baltimore.Mike Subelskynoreply@blogger.comBlogger210125tag:blogger.com,1999:blog-6369418367411691447.post-50265326868495397302015-09-23T12:48:00.001-04:002015-09-23T12:48:23.451-04:00Socio-Technical Systems and the STAQ Development Manual (Redacted)I recently wrote a <a href="http://www.slideshare.net/subelsky/staq-development-manual-redacted">development manual for STAQ</a> (embedded below). It represents our current thinking about the best way to build enterprise SaaS software in 2015 - using a variety of techniques from several disciplines. Since I wrote this I have also become very interested in <a href="http://www.kitchensoap.com/2011/04/07/resilience-engineering-part-i/">resilience engineering</a> and the notion that web developers are primarily engaged in the construction of <a href="https://en.wikipedia.org/wiki/Sociotechnical_system">socio-technical systems</a>. When I rewrite this I plan to talk about how we should try to minimize mean-time-to-recover (MTTR) instead of mean-time-between-failures (MTBF), and how continuous deployment grows a safety culture around your operations.<br /><br />I redacted most of the examples that illustrate these points because they use sensitive code examples or URLs. If you want to see the rest of slides, <a href="http://programmerswanted.staq.com/">join us</a>!<br /><br /><b>Side note</b>: I tweeted that "<a href="https://twitter.com/subelsky/status/602260383525707777">all programmers are self-taught</a>" which was greeted by some skepticism. When I learned about socio-technical systems I thought it was a pretty good distillation of what I meant; you can go to school to learn how to write algorithms, but as far as I know, nobody is teaching classes in writing software that comprises "an interlinked, systems based mixture of people, technology and their environment."<br /><br /><iframe allowfullscreen="" frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/FKDurRo2FmGgZ1" style="border-width: 1px; border: 1px solid #CCC; margin-bottom: 5px; max-width: 100%;" width="425"> </iframe> <br /><div style="margin-bottom: 5px;"><strong> <a href="https://www.slideshare.net/subelsky/staq-development-manual-redacted" target="_blank" title="STAQ Development Manual (Redacted)">STAQ Development Manual (Redacted)</a> </strong> from <strong><a href="https://www.slideshare.net/subelsky" target="_blank">Mike Subelsky</a></strong> </div>Mike Subelskynoreply@blogger.com0tag:blogger.com,1999:blog-6369418367411691447.post-59880568493396891442015-09-13T19:14:00.003-04:002015-09-13T19:52:21.804-04:00Google Hangout URL for tonight's ignitespeak open source orientationI don't think the last post made this clear, but <a href="https://plus.google.com/events/cgfls37866u26gnd6h34sg9lb94">here's the link</a> to tonight's Google hangout session, where I will be conducting an orientation of the app and how it works and what we need.<br /><br />Here's an embed of the event!<br /><br /><iframe allowfullscreen="" frameborder="0" height="315" src="//www.youtube.com/embed/G1KhFPjjuns" width="560"></iframe>Mike Subelskynoreply@blogger.com0tag:blogger.com,1999:blog-6369418367411691447.post-53179730957109863672015-09-10T10:36:00.000-04:002015-09-10T10:36:29.793-04:00Project orientation for ignitespeak on 9/13I'll be holding an online orientation session for the <a href="http://www.subelsky.com/2015/08/i-want-to-mentor-you-on-open-source.html">ignitespeak project</a> on Sunday, 9/13/15 at 8:00 pm. It'll be a <a href="https://plus.google.com/hangouts/_/calendar/c3ViZWxza3kuY29tXzFpOG90bHZnNGxkYWJlMzFocXZzcDhxaTZvQGdyb3VwLmNhbGVuZGFyLmdvb2dsZS5jb20.10qublqbk3efp13nik9aegjhhg?authuser=0">Google Hangout</a>, and we'll record it in case you can't make it.<br /><br />I wanted to do something efficient to help get everyone up to speed. Right now everyone's getting bogged-down in setup issues.<br /><br /><a href="https://www.google.com/calendar/event?action=TEMPLATE&tmeid=MTBxdWJscWJrM2VmcDEzbmlrOWFlZ2poaGcgc3ViZWxza3kuY29tXzFpOG90bHZnNGxkYWJlMzFocXZzcDhxaTZvQGc&tmsrc=subelsky.com_1i8otlvg4ldabe31hqvsp8qi6o%40group.calendar.google.com" target="_blank"><img border="0" src="https://www.google.com/calendar/images/ext/gc_button1_en.gif" /></a>Mike Subelskynoreply@blogger.com1tag:blogger.com,1999:blog-6369418367411691447.post-76599718260537985112015-08-27T13:21:00.002-04:002015-09-10T10:36:48.758-04:00I want to mentor you on an open source Rails project<i>Update: <a href="http://www.subelsky.com/2015/09/project-orientation-for-ignitespeak-on.html">there's an orientation session on 9/13/15</a> if you're interested in helping</i><br /><i><br /></i>I built a small, fun Rails app called <a href="https://github.com/ignitebaltimore/ignitespeak">ignitespeak</a> to manage speakers and proposals for <a href="http://www.ignitebaltimore.com/">Ignite Baltimore</a>. I've long thought that it would be a great project for beginners to work on, because it's well-tested, it gets regular use, and it's open source.<br /><br />I have an ambition to make the app more useful and available to all Ignite organizations around the world. If you're looking for a way to break into Rails development, and would like to get my personal attention, advice, or mentoring on your commits and pull requests, please contribute! I created <a href="https://github.com/ignitebaltimore/ignitespeak/issues">a number of Github issues</a> for some possible projects.<br /><br />If you're really serious about gaining more Ruby/Rails skills, I'd even be willing to do some pair programming with you, either remotely or at an <a href="http://www.bmoreonrails.org/">open source hack night</a>.Mike Subelskynoreply@blogger.com0tag:blogger.com,1999:blog-6369418367411691447.post-82020337154134152562015-08-10T09:46:00.003-04:002015-08-10T09:46:39.995-04:00Stepping down from Ignite Baltimore leadershipI have a post up on Technical.ly Baltimore, <a href="http://technical.ly/baltimore/2015/08/07/mike-subelsky-ignite-baltimore-leadership-change/">Why I'm stepping down from Ignite Baltimore</a>:<br /><blockquote class="tr_bq">For the past several years, Neal Shaffer, Jen Meyer and I have had the privilege of helping to organize <a href="http://www.ignitebaltimore.com/">Ignite Baltimore</a>, where 16 (or so) speakers each get five minutes to present an idea with slides that advance automatically every 15 seconds. </blockquote><blockquote class="tr_bq">It has been an extremely rewarding experience. Through Ignite we’ve met some of the most thoughtful, passionate and creative people around town. We even got to fly in one of the founders of Ignite, Brady Forrest (whose talk appears in the list below). Though I have been most publicly associated with Ignite, in reality it has been a group effort from the start: Patti Chan and I originally started working on Ignite back in 2008. Eventually the team grew to include awesome friends like Neal and Jen, and also Heather Sarkissian, Christian Malone, Lindsey Davis and Melissa Macchiavelli. </blockquote><blockquote class="tr_bq">But now it’s time for new leadership and new ideas. Jen, Neal and I are stepping down from the Ignite Baltimore team.</blockquote>Check out <a href="http://technical.ly/baltimore/2015/08/07/mike-subelsky-ignite-baltimore-leadership-change/">the full post</a> for more details, including a list of some of my favorite Ignite videos!Mike Subelskynoreply@blogger.com0tag:blogger.com,1999:blog-6369418367411691447.post-13729963598775236302015-06-30T11:30:00.000-04:002015-06-30T11:30:00.506-04:00Lean advertising for startupsMy friend (and STAQ advisor) Brent Halliburton is writing a book called <a href="http://kck.st/1GmkfdK">Lean Advertising for Startups</a>, and he's running a Kickstarter campaign to support it. I've known Brent for a long time and he is an expert on advertising, so this is going to be a really useful book. It fills a hole in startup literature opened by the promise of books like The Lean Startup, which encourages businesses to experiment and learn what works while avoiding waste. I don't think anyone since then has written extensively about what how to actually do this in practice when you don't have a huge budget, using currently-available technology. That's where Brent comes in! I <a href="http://kck.st/1GmkfdK">backed his project</a> and hope everyone else does too!Mike Subelskynoreply@blogger.com0tag:blogger.com,1999:blog-6369418367411691447.post-2482735430538540732015-06-26T08:22:00.002-04:002015-06-26T08:22:34.039-04:00Today is refactoring dayToday is refactoring day at STAQ. From an email I just sent to our team:<br /><blockquote class="tr_bq" style="color: #222222; font-family: arial, sans-serif; font-size: small;"><span style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: x-small;">My hope is that today we focus on maintenance of the most critical parts of the app, resolving the most painful hacks, paying down the most significant parts of our technical debt, while being careful to avoid </span><a href="https://en.wiktionary.org/wiki/yak_shaving" style="color: #1155cc; font-family: arial, sans-serif; font-size: small;">yak-shaving</a><span style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: x-small;"> or </span><a href="http://blog.codinghorror.com/gold-plating/" style="color: #1155cc; font-family: arial, sans-serif; font-size: small;">gold-plating</a><span style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: x-small;">, or various other programmer pitfalls. It also needs to be something that can be finished by close of business.</span></blockquote><blockquote class="tr_bq" style="color: #222222; font-family: arial, sans-serif; font-size: small;"><span style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: x-small;"></span>Definitely check in with team leaders to make sure your project meets that definition :-)</blockquote><blockquote class="tr_bq" style="color: #222222; font-family: arial, sans-serif; font-size: small;">Personally, I think I am going to take a quick look at [some occasional weird exceptions in Airbrake] and pick 1 or 2 of those to put to bed. Then I am going to do some "<a href="http://steveblank.com/2015/05/19/organizational-debt-is-like-technical-debt-but-worse/" style="color: #1155cc;">organizational refactoring</a>"</blockquote><blockquote class="tr_bq" style="color: #222222; font-family: arial, sans-serif; font-size: small;">-Mike</blockquote> I'm really looking forward to seeing what we come up with! I've been wanting to try this for a few years, since I heard a story about LivingSocial. According to the story, there was a period of time when they did this kind of thing every Friday - no new code was allowed to be committed on Fridays: the team work on only fixes, refactorings, deletions, etc.Mike Subelskynoreply@blogger.com0tag:blogger.com,1999:blog-6369418367411691447.post-18952828177830002382015-06-10T11:15:00.002-04:002015-06-10T11:15:34.203-04:00Programmers WantedI've been thinking a lot about recruiting and hiring programmers for STAQ, and about how to use plain language in business to communicate more clearly and forcefully. I want us to sound smart, professional, easygoing yet intensely focused. While doing this thinking, a friend introduced me to the idea of <a href="https://hbr.org/2015/05/ceos-need-to-pay-attention-to-employer-branding">employer branding</a>, which is totally a buzzword but still a good concept to keep in mind: you have to use different language and even different URLs when reaching out to different kinds of people.<br /><br />These thoughts informed my work on a recruiting microsite called <a href="https://programmerswanted.staq.com/">Programmers Wanted</a>. It's intentionally simple and plain and straightforward. I want to talk directly to programmers and communicate our values, without having to spell them out in some corporate way. The main thing I'm hoping to convey is: "there's interesting stuff to work on and people whom you will enjoy spending time with, no matter what background you come from". I think I can boil the language down even further but Programmers Wanted is my first attempt at claiming a tech employer brand for STAQ.Mike Subelskynoreply@blogger.com1tag:blogger.com,1999:blog-6369418367411691447.post-85516286688091119982015-05-01T11:34:00.002-04:002015-05-01T11:37:28.159-04:00Smart, sensitive perspectives on Baltimore current events<span style="font-family: inherit;">These are the best articles I've read so far about recent events in my adopted hometown. I prepared it for <a href="https://tinyletter.com/subelsky">my weekly newsletter</a> but wanted to disseminate here as well. </span>Even if you're not local, it's worthwhile reading: these are American patterns.<br /><br /><ul style="background-color: white; border: 0px; color: #505050; line-height: 24px; margin: 0px; max-width: 100%; outline: none; padding: 0px 0px 0px 40px; vertical-align: baseline;"><li style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; font-style: inherit; font-weight: inherit; margin: 0px; max-width: 100%; outline: none; padding: 0px; vertical-align: baseline;"><span style="font-family: inherit;"><a href="http://www.theatlantic.com/politics/archive/2015/04/nonviolence-as-compliance/391640/" style="border: 0px; color: #3466cc; font-style: inherit; font-weight: inherit; margin: 0px; max-width: 100%; outline: none; padding: 0px; text-decoration: none; vertical-align: baseline;"><em style="border: 0px; font-weight: inherit; margin: 0px; max-width: 100%; outline: none; padding: 0px; vertical-align: baseline;">As Riots Follow Freddie Gray's Death in Baltimore, Calls for Calm Ring Hollow</em></a> (theatlantic.com): "When nonviolence is preached by the representatives of the state, while the state doles out heaps of violence to its citizens, it reveals itself to be a con."</span></li></ul><ul style="background-color: white; border: 0px; color: #505050; line-height: 24px; margin: 0px; max-width: 100%; outline: none; padding: 0px 0px 0px 40px; vertical-align: baseline;"><li style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; font-style: inherit; font-weight: inherit; margin: 0px; max-width: 100%; outline: none; padding: 0px; vertical-align: baseline;"><span style="font-family: inherit;"><a href="http://www.washingtonpost.com/blogs/wonkblog/wp/2015/04/29/the-long-painful-and-repetitive-history-of-how-baltimore-became-baltimore/" style="border: 0px; color: #3466cc; font-style: inherit; font-weight: inherit; margin: 0px; max-width: 100%; outline: none; padding: 0px; text-decoration: none; vertical-align: baseline;"><em style="border: 0px; font-weight: inherit; margin: 0px; max-width: 100%; outline: none; padding: 0px; vertical-align: baseline;">The long, painful and repetitive history of how Baltimore became Baltimore</em></a> (washingtonpost.com): "...the outright racism that motivated many of these historic policies has eroded with time. "But we have to understand," Fullilove says, "the machine can work without the operator."</span></li></ul><ul style="background-color: white; border: 0px; color: #505050; line-height: 24px; margin: 0px; max-width: 100%; outline: none; padding: 0px 0px 0px 40px; vertical-align: baseline;"><li style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; font-style: inherit; font-weight: inherit; margin: 0px; max-width: 100%; outline: none; padding: 0px; vertical-align: baseline;"><span style="font-family: inherit;"><a href="http://www.nytimes.com/2015/05/01/opinion/david-brooks-the-nature-of-poverty.html" style="border: 0px; color: #3466cc; font-style: inherit; font-weight: inherit; margin: 0px; max-width: 100%; outline: none; padding: 0px; text-decoration: none; vertical-align: baseline;"><em style="border: 0px; font-weight: inherit; margin: 0px; max-width: 100%; outline: none; padding: 0px; vertical-align: baseline;">The Nature of Poverty</em></a> (nytimes.com): "The world is waiting for a thinker who can describe poverty through the lens of social psychology."</span></li></ul><ul style="background-color: white; border: 0px; color: #505050; line-height: 24px; margin: 0px; max-width: 100%; outline: none; padding: 0px 0px 0px 40px; vertical-align: baseline;"><li style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; font-style: inherit; font-weight: inherit; margin: 0px; max-width: 100%; outline: none; padding: 0px; vertical-align: baseline;"><span style="font-family: inherit;"><a href="http://www.washingtonpost.com/blogs/wonkblog/wp/2015/04/28/what-you-really-need-to-know-about-baltimore-from-a-reporter-who-lived-there-for-30-years/" style="border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; color: #3466cc; font-style: inherit; font-weight: inherit; margin: 0px; max-width: 100%; outline: none; padding: 0px; text-decoration: none; vertical-align: baseline;"><em style="border: 0px; font-weight: inherit; margin: 0px; max-width: 100%; outline: none; padding: 0px; vertical-align: baseline;">What you really need to know about Baltimore, from a reporter who’s lived there for over 30 years - The Washington Post</em></a> (washingtonpost.com): "The two worlds bump up against one another only on occasion. Maybe when a line of daredevils on dirt bikes — the storied 12 O’clock Boys — startle motorists by doing near-vertical, high-speed wheelies in city traffic, or when groups of kids brawl in the tourist zone surrounding the Inner Harbor."</span></li></ul>Mike Subelskynoreply@blogger.com0tag:blogger.com,1999:blog-6369418367411691447.post-78758553145870087542015-02-06T11:52:00.001-05:002015-02-13T10:06:28.683-05:00Startup leadership hack: make an opportunities listMy partner James came up with a pretty good idea for opening up more opportunities for career growth at Staq. We call it the "opportunity list": a priority-sorted list of projects that we should be doing, but aren't, because everyone is busy with day-to-day responsibilities.<br /><br />Opportunities are thing that could potentially be someone's entire job in the future, and would make the company a lot more successful/comfortable in the short-term. Each project is a chance to step up and exercise leadership outside of one's "day job".<br /><br />Here's an excerpt of the list I just whipped up:<br /><br /><div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-FynXDaJy4bg/VN4S31aR_hI/AAAAAAAAFmI/9KoAlNurw74/s1600/skitch.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-FynXDaJy4bg/VN4S31aR_hI/AAAAAAAAFmI/9KoAlNurw74/s1600/skitch.png" height="210" width="400" /></a></div><br /><br />We have similar lists for other departments, so, wanting to set a good example, I picked "contract volley". I'm going to help figure out how to speed up the end of the sales process where specific details of our contracts are negotiated.<br /><br />My first idea was "let's throw some tech at the problem". I found that there's a whole niche market for <a href="http://www.selectica.com/resources/guide/contract-management-guide#.VNTwiVPF9V1">contract management software</a>, but none of it looks geared towards a scrappy startup. (I understand why companies do this, but personally if your app has a "Request a Demo" button, I'm gone. I just don't have time to make appointments, and that also implies a much longer onboarding process. Please just let me give you my credit card and start a free trial!)Mike Subelskynoreply@blogger.com1tag:blogger.com,1999:blog-6369418367411691447.post-47447747940402184552014-11-19T10:39:00.000-05:002014-11-19T10:42:29.191-05:00Baltimore Hackathon Thread.org After Action ReportLast weekend's <a href="http://baltimorehackathon.com/">Baltimore Hackathon</a> project to help <a href="http://thread.org/">Thread</a> 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.<br /><br />We focused on documenting the app and making it ready for easy improvements. Here's what we accomplished:<br /><br /><ul><li>Setup a private <a href="https://bitbucket.org/">bitbucket</a> git repository where we could share code changes</li><li>Created a setup README file explaining how to use <a href="http://www.mamp.info/">MAMP</a> 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 <a href="http://www.codeigniter.com/">CodeIgniter</a>)</li><li>Made minor changes to CodeIgniter settings so the app could be run locally in a development mode</li><li>Added a Neighborhood field to the application UI and underlying MySQL table so that volunteers can document the locations where they work.</li></ul><div>The next steps include:</div><div><ul><li>Connecting Thread's data analyst with the Salesforce experts (should happen later this week)</li><li>Adding a simple leaderboard that shows the number of interactions per volunteer.</li><li>Deploying our changes to Thread's staging server and rehearsing the database migration</li><li>Deploying to the production application server</li><li>Drafting suggestions for long-term upgrades and maintenance to avoid <a href="http://en.wikipedia.org/wiki/Software_rot">software rot</a></li></ul></div><br /><br />Mike Subelskynoreply@blogger.com0tag:blogger.com,1999:blog-6369418367411691447.post-38875337039500483262014-11-10T10:27:00.000-05:002014-11-12T13:46:45.438-05:00Help Thread Help Baltimore at the Baltimore Hackathon<span style="color: #232323; font-family: Arial;"><span style="background-color: white;"><i>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!</i></span></span><br /><span style="color: #232323; font-family: Arial;"><span style="background-color: white;"><i><br /></i></span></span><span style="color: #232323; font-family: Arial;"><span style="background-color: white;">This weekend I am planning to work on a service project at the <a href="http://baltimorehackathon.com/">Baltimore Hackathon</a> and I would love to form a group to work together! I have been working with <a href="http://thread.org/">Thread</a>, 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.</span></span><br /><span style="color: #232323; font-family: Arial;"><span style="background-color: white;"><br /></span></span><span style="color: #232323; font-family: Arial;"><span style="background-color: white;">Details below. Please <a href="mailto:mike@staq.com">e-mail me</a> if you'd like to team up!</span></span><br /><span style="color: #232323; font-family: Arial;"><span style="background-color: white;"><br /></span></span><span style="background-color: white; color: #232323; font-family: Arial; font-stretch: normal;"><b>BACKGROUND</b></span><br /><span style="color: #222222; font-family: Arial;"><br /></span><span style="color: #222222; font-family: Arial;">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.</span><br /><div><br /></div><div style="background-color: white;"><span style="color: #222222; font-family: Arial; font-stretch: normal;"><b>PROBLEM 1: CAPTURE MORE INTERACTIONS AND LOCATION OF INTERACTIONS</b></span><br /><span style="color: #222222;"><span style="font-family: Arial; font-stretch: normal;"></span></span><br /><span style="color: #222222; font-family: Arial; font-stretch: normal;">According to Thread (emphasis mine):</span><br /><blockquote class="tr_bq"><span style="color: #222222; font-family: arial, sans-serif;">"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 <a href="https://www.nextjump.com/">NextJump</a> to help create a website optimized for mobile devices that would make logging significantly easier.</span></blockquote><blockquote class="tr_bq"><span style="color: #222222; font-family: arial, sans-serif;">"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, <b>ThreadShare is still missing two critical components, a more comprehensive feedback loop and increased engagement functionality</b>. 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. </span> </blockquote><blockquote class="tr_bq"><span style="color: #222222; font-family: arial, sans-serif;">"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."</span> </blockquote><blockquote class="tr_bq"><span style="color: #222222; font-family: arial, sans-serif;">"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.”</span></blockquote><span style="color: #222222;"><span style="font-family: Arial; font-stretch: normal;"></span></span><br /><span style="color: #222222; font-family: Arial; font-stretch: normal;"><b>PROBLEM 2: SALESFORCE INTEGRATION</b></span><br /><span style="color: #222222;"><span style="font-family: Arial; font-stretch: normal;"></span></span><br /><span style="color: #222222; font-family: Arial; font-stretch: normal;">Thread is moving various business operations to a Salesforce application, and there is currently no automatic means of transferring IMPshare data to Salesforce.</span><br /><span style="color: #222222;"><span style="font-family: Arial; font-stretch: normal;"></span></span><br /><span style="color: #222222; font-family: Arial; font-stretch: normal;"><b>PROBLEM 3: MAINTENANCE PLAN TO PROTECT AGAINST CODE ROT</b></span><br /><span style="color: #222222;"><span style="font-family: Arial; font-stretch: normal;"></span></span><br /><span style="color: #222222; font-family: Arial; font-stretch: normal;">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.</span></div><div style="background-color: white; color: #222222; font-family: arial, sans-serif;"><br /></div><div style="background-color: white; color: #222222; font-family: arial, sans-serif;"><span style="font-family: Arial; font-stretch: normal;"><b>TECHNOLOGIES</b></span><br /><span style="font-family: Arial; font-stretch: normal;"></span><br /><span style="font-family: Arial; font-stretch: normal;">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.</span><br /><span style="font-family: Arial; font-stretch: normal;"></span><br /><span style="font-family: Arial; font-stretch: normal;"><b>POTENTIAL HACKATHON PROJECTS</b></span><span style="font-family: Arial; font-stretch: normal;"><br /></span></div><div style="background-color: white;"><ul><li style="color: #222222; font-family: arial, sans-serif; margin-left: 15px;"><span style="font-family: Arial;">Partially address problem #3 by engaging Baltimore's PHP and mobile web communities: we can make IMPshare easy to work on.</span></li><ul style="color: #222222; font-family: arial, sans-serif;"><li style="margin-left: 15px;"><span style="font-family: Arial;">Move the code to a private bitbucket or github repository. Consider making it an open source application.</span></li><li style="margin-left: 15px;"><span style="font-family: Arial;">Create a setup script that installs dependencies and allows code to be run locally</span></li><li style="margin-left: 15px;"><span style="font-family: Arial;">Write technical documentation & make diagrams, including a thorough README that explains how to run the app in a development environment</span></li><li style="margin-left: 15px;"><span style="font-family: Arial;">Create sample / test data</span></li><li style="margin-left: 15px;"><span style="font-family: Arial;">Create an app deployment procedure for the staging and production environments</span></li><li style="margin-left: 15px;"><span style="font-family: Arial;">Sign up to present the project at Baltimore PHP and Mobile and Techies For Good meet ups</span></li><li style="margin-left: 15px;"><span style="font-family: Arial;">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.)</span></li></ul><li style="color: #222222; font-family: arial, sans-serif; margin-left: 15px;"><span style="font-family: Arial;">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).</span></li><ul style="color: #222222; font-family: arial, sans-serif;"><li style="margin-left: 15px;"><span style="font-family: Arial;">If Thread likes it, this report could be incorporated directly into the app’s user interface</span></li></ul><li style="color: #222222; font-family: arial, sans-serif; margin-left: 15px;"><span style="font-family: Arial;">Add a “Neighborhood” field to the user interface</span></li><ul style="color: #222222; font-family: arial, sans-serif;"><li style="margin-left: 15px;"><span style="font-family: Arial;">Can leverage HTML5 APIs to auto-fill with the user’s current location</span></li></ul><li style="color: #222222; font-family: arial, sans-serif; margin-left: 15px;"><span style="font-family: Arial; font-stretch: normal;">Prototype an impact map that uses </span><span style="color: #042eee; font-family: Arial; font-stretch: normal;"><u>various Google geocoding APIs</u></span><span style="font-family: Arial; font-stretch: normal;"> to geocode locations using the new "neighborhood" field</span></li><li style="color: #222222; font-family: arial, sans-serif; margin-left: 15px;"><span style="font-family: Arial; font-stretch: normal;">Setup MySQL backups</span></li><li style="color: #222222; font-family: arial, sans-serif; margin-left: 15px;"><span style="font-family: Arial; font-stretch: normal;">Create a standalone reporting app that allows database gurus to create SQL reports that could be embedded in Google Docs</span></li><li style="color: #222222; font-family: arial, sans-serif; margin-left: 15px;"><span style="font-family: Arial;">Prototype an IMPshare-to-Salesforce connector</span></li><ul style="color: #222222; font-family: arial, sans-serif;"><li style="margin-left: 15px;"><span style="font-family: Arial; font-stretch: normal;">Will need to gather more data about Thread’s salesforce installatio</span></li></ul></ul><div><span style="color: #222222; font-family: Arial;"><b>FAQ</b></span></div><div><span style="color: #222222; font-family: Arial;"><b><br /></b></span></div><div><div><span style="color: #222222; font-family: Arial;"><i>Q: I want to help but this is pretty short notice so I'm not available this weekend? Can I still help?</i></span></div></div><div><span style="color: #222222; font-family: Arial;"><i><br /></i></span></div><div><span style="color: #222222; font-family: Arial;">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.</span></div><div><span style="color: #222222; font-family: Arial;"><i><br /></i></span></div><div><span style="color: #222222; font-family: Arial;"><i>Q: I'm new / inexperienced / young / don't know PHP. Can I still help?</i></span></div><div><span style="color: #222222; font-family: Arial;"><i><br /></i></span></div><div><span style="color: #222222; font-family: Arial;">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.</span></div><div><span style="color: #222222; font-family: Arial;"><br /></span></div><div><span style="color: #222222; font-family: Arial;"><i>Q: I'm a designer, can I help?</i></span></div><div><span style="color: #222222; font-family: Arial;"><i><br /></i></span></div><div><span style="color: #222222; font-family: Arial;">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.</span></div><div><span style="color: #222222; font-family: Arial;"><br /></span></div><div><span style="color: #222222; font-family: Arial;"><i>Q: I'm a tech writer, can I help?</i></span></div><div><span style="color: #222222; font-family: Arial;"><i><br /></i></span></div><div><div><span style="color: #222222; font-family: Arial;">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.</span></div></div><ul><ul style="color: #222222; font-family: arial, sans-serif;"></ul></ul></div>Mike Subelskynoreply@blogger.com0tag:blogger.com,1999:blog-6369418367411691447.post-36828791596712261492014-11-01T15:26:00.003-04:002014-11-01T15:27:35.706-04:00Notes from DC CTO summitI 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!<br /><br />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.<br /><ul><li><a href="http://loki.ws/">Joshua Szmajda</a> showed off a <a href="https://speakerdeck.com/joshsz/visualizing-agile">really impressive use of a whiteboard for kanban</a>. 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.</li><li>Joshua cited the kanban book <a href="http://www.amazon.com/Lean-Trenches-Managing-Large-Scale-Projects/dp/1934356859">Lean from the Trenches</a> which sounds good. An audience member recommended <a href="http://kanbanery.com/">kanbanery.com</a> for an online version of the whiteboard.</li><li>Quote: "Working software is the only metric"</li><li>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. </li><ul><li><a href="http://www.paulbarry.com/">Paul Barry</a> 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.</li><li>Reminds me of <a href="http://sivers.org/how2hire">Derek Sivers's advice</a> on how to hire programmers</li></ul><li><a href="https://twitter.com/edwardjkim">Edward Kim</a> 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. </li><ul><li>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.</li><li>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.</li><li>They have a <a href="https://medium.com/social-tables-tech/hello-world-webgl-79f430446b5c">dev blog</a> hosted on medium - supervised by a person wearing the "Blog master hat"</li><li>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.</li></ul><li>Paul Barry recommended using <a href="https://www.optimizely.com/">Optimizely</a> 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</li><ul><li>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</li></ul><li><a href="https://twitter.com/amontalenti">Andrew Montalenti</a> presented an inside look at the daily routines of the <a href="http://www.parsely.com/">parsely</a> remote team. I like the idea of syncing every developer to a familiar weekly rhythm</li><ul><li>Start the day with a #standup chat message explaining what you're planning to work on</li><li>End the day with a #sitdown message explaining what you accomplished, what you're stuck on</li><li>Monday: bug fixing and planning day</li><li>Tuesday: 30 minute (virtual) staff meeting to kick off the week</li><li>Tuesday noon through Friday noon: uninterrupted flow time. No meetings. All coding.</li><li>Friday at noon: demo time</li><li>Friday afternoon: tie up loose ends</li><li>No weekend work / rest and recover</li></ul></ul>Mike Subelskynoreply@blogger.com1tag:blogger.com,1999:blog-6369418367411691447.post-48326440611645510142014-10-29T11:11:00.000-04:002014-10-29T11:11:11.825-04:00Building talent the old-fashioned way at DC CTO summitYesterday I gave a talk at the DC Startup CTO summit called <i>Building Talent the Old-Fashioned Way </i>about last year's Staq Ruby Apprentice Program<i>. </i><div><br /></div><div>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 <a href="https://github.com/subelsky/building_talent/blob/master/presentation/one/01_slide.md">check 'em out</a>!<br /></div>Mike Subelskynoreply@blogger.com0tag:blogger.com,1999:blog-6369418367411691447.post-54643324891624745402014-10-16T11:59:00.002-04:002014-10-16T11:59:22.540-04:00AWS Redshift Presentation Notes + CTO SummitOn Tuesday I spoke about our experiences using the <a href="http://aws.amazon.com/redshift/">Redshift database</a> at Staq. I experimented with using <a href="https://github.com/visit1985/mdp">mdp</a> to present the visuals, with mixed results (it's definitely good for writing presentations quickly, especially if you're conversant in <a href="http://daringfireball.net/projects/markdown/">Markdown</a> syntax).<br /><br />I posted <a href="https://github.com/subelsky/redshift_presentation/blob/master/README.md">my outline</a> which includes links to additional reading on Github. Hope it's helpful!<br /><br />Also, I've been accepted as a speaker at the <a href="https://ti.to/startup-cto-summit/dc">DC CTO Summit</a> on 10/28. If you use the code <b>mike_online</b> when registering you get a $200 discount. (For that talk I'm thinking about trying <a href="https://github.com/akrennmair/tpp/">tpp</a> though I am having some ncurses issues on OS X)Mike Subelskynoreply@blogger.com0tag:blogger.com,1999:blog-6369418367411691447.post-20158511154445823902014-09-09T08:08:00.003-04:002014-09-09T08:08:26.039-04:00Baltimore Innovation Week Kicks Off Friday<a href="http://2014.baltimoreinnovationweek.com/">Baltimore Innovation Week 2014</a> starts on Friday. The schedule is pretty spectacular - if you care about cities and technology and innovation, you gotta be there!<br /><br />Our event <a href="http://ignitebaltimore.com/">Ignite Baltimore</a> is one of the events; tickets are sold out but we release a lot of <a href="http://www.eventbrite.com/e/ignite-baltimore-15-tickets-12667459713">waiting list tickets</a>.Mike Subelskynoreply@blogger.com0tag:blogger.com,1999:blog-6369418367411691447.post-20666544496514931322014-05-12T11:45:00.003-04:002014-06-03T14:36:16.774-04:00Fixing "SocketError: getaddrinfo: Name or service not known" with Ruby's resolv-replace.rb<i>Update 6/3/2014: <a href="http://coderrr.wordpress.com/2007/12/06/backgrounding-tasks-in-rails-with-threads-and-using-resolv-replace-to-make-them-faster/">there are other advantages</a> to using a pure-Ruby DNS implementation.</i><br /><i><br /></i>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):<br /><br /><pre></pre><pre>irb(main):009:0> Socket.gethostbyname("example.net")<br />SocketError: getaddrinfo: Name or service not known<br /></pre><br />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 <a href="https://www.omniref.com/ruby/2.1.1/classes/Resolv">Resolv library</a>, something I had not encountered before. This post is a little breadcrumb to help others who may have the same problem.<br /><br />Resolv uses Ruby code to do DNS lookups, instead of relying on the system's libc installation like <code>gethostbyname</code> does. Rather than having to monkeypatch <code>net/http</code>, all I had do to was add <code>require "resolv-replace.rb"</code> 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!Mike Subelskynoreply@blogger.com10tag:blogger.com,1999:blog-6369418367411691447.post-89109695487842183452014-05-09T12:46:00.001-04:002014-05-09T12:46:41.587-04:00Looking for a Rubyist<a href="http://staq.com/">Staq</a> 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 <a href="http://ianlotinsky.wordpress.com/2014/02/14/the-10x-engineer-and-delegated-responsibility/">culture of delegated responsibility</a>, who can help coach the rest of the team and help with system design, please <a href="mailto:mike@staq.com">get in touch</a>!<br /><br />We offer all of the usual startup perquisites: salary, plenty of equity, autonomy, and the opportunity to grow your career along with the company.<br /><br /><i>PS We also write a lot of JavaScript and even a smattering of Python.</i>Mike Subelskynoreply@blogger.com0tag:blogger.com,1999:blog-6369418367411691447.post-20801843377911821832014-03-25T09:51:00.001-04:002014-03-25T09:51:08.248-04:00How I Work<div class="tr_bq"><a href="http://technical.ly/baltimore/">Technically Baltimore</a> 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. <a href="http://technical.ly/baltimore/2014/03/24/mike-subelsky-staq/">Check it out</a> if you like to nerd out on tools and productivity! Excerpt below.</div><br /><blockquote><b>When you need to take a break, what are you turning to?</b> </blockquote><blockquote>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“). </blockquote><blockquote>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. </blockquote><blockquote>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.</blockquote><a href="http://technical.ly/baltimore/2014/03/24/mike-subelsky-staq/">The full interview is at Technically Baltimore</a>.Mike Subelskynoreply@blogger.com0tag:blogger.com,1999:blog-6369418367411691447.post-25467565063882616262014-03-04T09:07:00.003-05:002014-03-04T09:07:55.600-05:00Requiem for gb.tcI'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.<br /><br />Last month we learned that <a href="http://gb.tc/">gb.tc</a>, one of my favorite Baltimore institutions, <a href="http://technical.ly/baltimore/2014/02/21/gb-tc-announces-hiatus-greg-cangialosi-takes-chair/">is going "on hiatus"</a>. This news filled-me with sadness and I don't want the event to go by without remarking on it. gb.tc 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 gb.tc - harnessing the grassroots/bottom-up energy of technologists and helping organizing it into a force for good in the city.<br /><br />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 <a href="http://www.subelsky.com/2011/05/innovation-community-manager.html">I called for back in 2011</a>). For example, I helped run the first (and so far, only) <a href="http://railsgirls.com/baltimore">RailsGirls event</a> 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, <a href="http://www.girldevelopit.com/chapters/baltimore">Girl Develop It</a> has come to Baltimore, but look at all the time that went by between RailsGirls and Girl Develop It).<br /><br />gb.tc 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 gb.tc's efforts. They've also provided <a href="http://technical.ly/baltimore/2012/09/06/gbtc-onramp-accelerator-offers-mentoring-advice-minus-the-equity-stake/">free startup mentoring</a>, the "Baltimore Weekly" podcast, amazing "Tech Crawls", and many other valuable services.<br /><br />I'm not sure if I'm making sense here. Maybe go read that <a href="http://www.subelsky.com/2011/05/innovation-community-manager.html">Innovation Community Manager</a> post I wrote in 2011 to get a sense of what we've lost.<br /><br />It sounds like Betamore is going to try to provide a soft-landing for gb.tc. 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 gb.tc.<br /><br />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 gb.tc into what it was before their tenure). Your efforts made Baltimore a better place to do creative things, and we're poorer without you.Mike Subelskynoreply@blogger.com4tag:blogger.com,1999:blog-6369418367411691447.post-45085308082806322342014-02-20T12:20:00.002-05:002014-02-20T12:20:31.329-05:00Slides for Writing Clean, Concise, and Confident Ruby CodeToday I will be giving a talk at <a href="http://www.meetup.com/technically-baltimore/events/154811992/">NET/WORK</a> called <a href="https://github.com/subelsky/clean_clear_confident_ruby">Writing Clean, Concise, and Confident Ruby Code</a>. Since it's very code-focused, I once again used Stefan Otte's <a href="http://presenting.vim/">presenting.vim</a>. The slides (which include links to all of my references) are all <a href="https://github.com/subelsky/clean_clear_confident_ruby">up on Github</a>.<br /><br />I'm indebted to <a href="http://about.avdi.org/">Avdi Grimm</a> for providing much of the inspiration for this approach to Ruby, and to my <a href="http://staq.com/">Staq</a> colleagues for letting me try out my armchair programming philosophy on them!Mike Subelskynoreply@blogger.com0tag:blogger.com,1999:blog-6369418367411691447.post-50895079368776999012014-02-17T13:03:00.000-05:002014-02-17T13:03:00.693-05:00Web programming notes newsletterI'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.<br /><br />I decided to create a <a href="https://tinyletter.com/subelsky">mailing list</a> 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.<br /><br />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:<br /><br /><form action="https://tinyletter.com/subelsky" method="post" onsubmit="window.open('https://tinyletter.com/subelsky', 'popupwindow', 'scrollbars=yes,width=800,height=600');return true" style="border: 1px solid #ccc; padding: 3px; text-align: center;" target="popupwindow"><label for="tlemail">Enter your email address</label><br /><input id="tlemail" name="email" style="width: 140px;" type="text" /><br /><input name="embed" type="hidden" value="1" /><input type="submit" value="Subscribe" /><br /><a href="https://tinyletter.com/" target="_blank">powered by TinyLetter</a></form><br />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.<br /><ul><li><a href="http://12factor.net/">The Twelve-Factor App</a></li><li><a href="http://alistair.cockburn.us/Hexagonal+architecture">Hexagonal architecture</a></li><li><a href="http://allthingsd.com/20120829/one-on-one/">The Importance of One-on-One Meetings</a></li><li><a href="http://blackrat.org/ruby/getting-sikuli-script-working-with-jruby-on-the-mac/">Getting Sikuli Script working with JRuby on the Mac</a></li><li><a href="http://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html">The Clean Architecture</a></li><li><a href="http://blog.aggregateknowledge.com/2013/05/16/aws-redshift-how-amazon-changed-the-game/">AWS Redshift: How Amazon Changed The Game</a></li><li><a href="http://blog.codeclimate.com/blog/2014/01/30/mob-refactoring/">Mob Refactoring</a></li><li><a href="http://blog.codeship.io/2013/12/16/yes-you-should-write-controller-tests.html">Yes, You Should Write Controller Tests!</a></li><li><a href="http://blog.jgc.org/2013/07/your-test-suite-is-trying-to-tell-you.html">Your test suite is trying to tell you something</a></li><li><a href="http://blog.socialcast.com/incremental-redesign-with-rails/">Incremental Redesign with Rails</a></li><li><a href="http://bohconf.com/">BohConf 2013</a></li><li><a href="http://bugroll.com/how-to-write-good-error-messages.html">How to Write Good Error Messages</a></li><li><a href="http://devblog.reverb.com/post/70344683203/5-architecture-anti-patterns-and-solutions-for-large">5 architecture anti-patterns and solutions for large Rails apps</a></li><li><a href="http://dmcca.be/2014/02/02/the-value-of-rails-worst-practices.html">The value of Rails worst practices</a></li><li><a href="http://en.wikipedia.org/wiki/Principle_of_least_privilege">Principle of least privilege</a></li><li><a href="http://fgnass.github.io/spin.js/">spin.js</a></li><li><a href="http://fredwu.me/post/59395419899/writing-sensible-tests-for-happiness">Writing Sensible Tests for Happiness</a></li><li><a href="http://gaslight.co/blog/6-ways-to-remove-pain-from-feature-testing-in-ruby-on-rails">6 Ways to Remove Pain From Feature Testing in Ruby on Rails</a></li><li><a href="http://gbayer.com/development/moving-files-from-one-git-repository-to-another-preserving-history/#comment-700639747">Moving Files from one Git Repository to Another, Preserving History</a></li><li><a href="http://ghendry.net/refactor.html">Ruby Refactoring Cheatsheet</a></li><li><a href="http://insideintercom.io/why-cards-are-the-future-of-the-web/">Why cards are the future of the web</a></li><li><a href="http://kerdany.wordpress.com/2013/11/23/how-does-bundler-do-its-magic/">How does Bundler do its magic?</a></li><li><a href="http://michaelfeathers.typepad.com/michael_feathers_blog/2013/06/avoid-null-checks-by-replacing-finders-with-tellers.html">Michael Feathers: Avoid Null Checks by Replacing Finders with Tellers</a></li><li><a href="http://michaelochurch.wordpress.com/2012/09/03/tech-companies-open-allocation-is-your-only-real-option/">Tech companies: open allocation is your only real option.</a></li><li><a href="http://michaelochurch.wordpress.com/2012/11/18/programmers-dont-need-a-union-we-need-a-profession/">Programmers don’t need a union. We need a profession.</a></li><li><a href="http://monkeyandcrow.com/blog/reading_rails_concern/">Reading Rails - Concern</a></li><li><a href="http://monkeyandcrow.com/blog/reading_rails_migrations">Reading Rails - Migrations</a></li><li><a href="http://oliveremberton.com/2014/life-is-a-game-this-is-your-strategy-guide/">Life is a game. This is your strategy guide.</a></li><li><a href="http://pivotallabs.com/object-oriented-rails-writing-better-controllers/">Object Oriented Rails - Writing better controllers</a></li><li><a href="http://programming.oreilly.com/2013/12/how-setting-aside-rails-and-picking-up-padrino-might-make-you-a-better-ruby-developer.html">How Setting Aside Rails and Picking Up Padrino Might Make You a Better Ruby Developer</a></li><li><a href="http://pryrepl.org/screencasts.html">Pry</a></li><li><a href="http://raganwald.com/2008/05/narcissism-of-small-code-differences.html">The Narcissism of Small Code Differences</a></li><li><a href="http://railscasts.com/episodes/275-how-i-test">#275 How I Test - RailsCasts</a></li><li><a href="http://re-factor.com/blog/2013/09/27/slow-tests-are-the-symptom-not-the-cause/">Slow Tests are the Symptom, not the Cause</a></li><li><a href="http://robots.thoughtbot.com/back-to-basics-http-requests">Back to Basics: HTTP Requests in Rails Apps</a></li><li><a href="http://robots.thoughtbot.com/don-t-stub-the-system-under-test/">Don't Stub the System Under Test</a></li><li><a href="http://robots.thoughtbot.com/handling-associations-on-null-objects">Handling Associations on Null Objects</a></li><li><a href="http://robots.thoughtbot.com/iteration-as-an-anti-pattern/">Anti-Pattern: Iteratively Building a Collection</a></li><li><a href="http://robots.thoughtbot.com/post/58313551647/renderable-null-objects">Renderable Null Objects</a></li><li><a href="http://stackoverflow.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby">Why is it bad style to `rescue Exception => e` in Ruby?</a></li><li><a href="http://vgaltes.com/index.php/2013/07/09/comparing-image-with-a-capture-with-casperjs">Comparing image with a capture with CasperJS</a></li><li><a href="http://viget.com/extend/simple-secure-file-transmission">Simple, Secure File Transmission</a></li><li><a href="http://www.amberbit.com/blog/2014/2/4/postgresql-awesomeness-for-rails-developers/">PostgreSQL awesomeness for Rails developers</a></li><li><a href="http://www.amundsen.com/blog/archives/1146">HTTP and REST and Hypermedia</a></li><li><a href="http://www.bhorowitz.com/why_i_did_not_go_to_jail">Why I Did Not Go to Jail</a></li><li><a href="http://www.saturnflyer.com/blog/jim/2013/10/21/how-to-make-your-code-imply-responsibilities">How to make your code imply responsibilities</a></li><li><a href="http://www.sitepoint.com/rails-security-pitfalls/">Rails Security Pitfalls</a></li><li><a href="http://www.software-testing.com.au/blog/2010/08/16/automating-flash-ajax-popups-and-more-using-ruby-watir-and-sikuli/">Automating Flash, AJAX, Popups and more using Ruby, Watir and Sikuli</a></li><li><a href="https://github.com/propublica/upton">propublica/upton</a></li><li><a href="https://github.com/rtomayko/replicate">rtomayko/replicate</a></li><li><a href="https://github.com/topfunky/gruff">topfunky/gruff</a></li></ul>Mike Subelskynoreply@blogger.com0tag:blogger.com,1999:blog-6369418367411691447.post-38110367983062310342014-02-03T09:30:00.000-05:002014-02-03T09:53:22.410-05:00Staq's Ruby Apprentice Program Was a Great Success!Back in September 2013 <a href="http://www.subelsky.com/2013/09/we-want-to-pay-you-to-learn-ruby-in.html">we announced Staq's apprentice program</a>, 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!<br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-T5jB9xRK-jQ/UuKXQ9kugJI/AAAAAAAADA8/CGDZneQ3KQ0/s1600/IMG_20140123_170403.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://1.bp.blogspot.com/-T5jB9xRK-jQ/UuKXQ9kugJI/AAAAAAAADA8/CGDZneQ3KQ0/s1600/IMG_20140123_170403.jpg" height="226" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Me, my partner James (2nd from left) and the new developers</td></tr></tbody></table>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.<br /><br />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.<br /><br />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 <a href="http://rspec.info/">rspec</a>. 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 <a href="http://mechanize.rubyforge.org/">mechanize</a> and <a href="http://typhoeus.github.io/">typhoeus</a>, along with a gentle introduction to <a href="http://casperjs.org/">CasperJS</a>. I should have introduced Staq's proprietary framework later in the process.<br /><br />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 <a href="http://rubydoc.info/gems/yard/">YARD annotations</a>.<br /><br />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, <a href="http://jumpstartlab.com/">Jeff Casimir</a>?). It would also be cool to coordinate our efforts with <a href="http://www.betamore.com/academy/">Betamore Academy</a>. 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.<br /><br />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.<br /><div><br /></div>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.<br /><br />We absolutely will do this again, but we've got to grow the business some more first. Watch this space for details!<br /><ul></ul>Mike Subelskynoreply@blogger.com1Baltimore, MD, USA39.2903848 -76.61218930000001139.0937408 -76.9349128 39.4870288 -76.289465800000016tag:blogger.com,1999:blog-6369418367411691447.post-12969608045905873232014-01-09T08:43:00.000-05:002014-01-09T08:43:54.687-05:00Rockstars, ninjas, and silent technical privilegeTechnically Baltimore <a href="http://technical.ly/baltimore/2014/01/08/mike-subelsky-rockstar-ninja">did a nice write up</a> of my recent appearance on the <a href="http://gb.tc/channels/live/">gb.tc podcast</a>. 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 <a href="http://www.subelsky.com/2013/09/we-want-to-pay-you-to-learn-ruby-in.html">spend a lot more time and money on training people</a> 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).<br /><br />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 <a href="http://pgbovine.net/tech-privilege.htm">silent technical privilege</a> that repels smart people who don't identify with those labels. The reporter also links to some further analysis of this problem, so <a href="http://technical.ly/baltimore/2014/01/08/mike-subelsky-rockstar-ninja/?utm_source=rss&utm_medium=rss&utm_campaign=mike-subelsky-rockstar-ninja&utm_reader=feedly">please check out the writeup</a>! And start using better recruiting language if you want to cast the widest net possible for talent.Mike Subelskynoreply@blogger.com0tag:blogger.com,1999:blog-6369418367411691447.post-44632944302370840302013-11-05T12:43:00.000-05:002013-11-05T12:43:02.097-05:00Staying fast and good when making enterprise software<div style="background-color: white; color: #222222;">My startup <a href="http://staq.com/">Staq</a> builds enterprise software using the techniques I've learned from building consumer web apps. As we bring more customers on and our revenue increases, we have more to lose when there's a bug in our code, and there's pressure to revert to a more traditional development process where the developers have less control. Specifically we're debating whether to move away from our current fast-paced "<a href="http://mayerdan.com/programming/2013/08/04/thoughts-on-continuous-deployment/" style="color: #1155cc;" target="_blank">manual continuous deployment</a>" process (where we're pushing code throughout the day, every day, and getting immediate feedback) to a more traditional commit-review-QA-release cycle. I have pretty strong feelings against going in that direction that I wanted to document here.</div><div style="background-color: white; color: #222222;"><br /></div><div style="background-color: white; color: #222222;">I know from experience that a process like that will inevitably slow us down, which we can't afford during this phase of hyper-growth. It can produce a boring, toxic work environment in the long run. Code you wrote today doesn't end up getting in front of a user until next week, and you've already forgotten the context to explain why you wrote that code the way you did. When there's a bug, you have to start from scratch when figuring out the problem. Feedback gets delayed, if you get it at all. </div><div style="background-color: white; color: #222222;"><br /></div><div style="background-color: white; color: #222222;">So how we stay fast while keeping the software quality high? How do we stay <a href="http://devblog.avdi.org/2011/01/07/fast-and-good/" style="color: #1155cc;" target="_blank">fast and good</a>?</div><div style="background-color: white; color: #222222;"><br /></div><div style="background-color: white; color: #222222;">I intend to establish a core value at Staq where we never, ever stop deploying. We make software at such a high level of quality, and our <a href="http://www.startuplessonslearned.com/2010/01/case-study-continuous-deployment-makes.html" style="color: #1155cc;" target="_blank">cluster immune system</a> is so awesome, that it's nearly impossible to kill the app. When defects occur, they are so obvious and so easy to correct, that users rarely notice the problem.</div><div style="background-color: white; color: #222222;"><br /></div><div style="background-color: white; color: #222222;">In the early days there may be times when we have to compromise on this value. When that happens, I want it to feel like an ugly compromise. I want the situation to become a sign that we need to improve our systems to get back to the platonic ideal of <a href="http://www.youtube.com/watch?v=8kZg_ALxEz0" style="color: #1155cc;" target="_blank">Always Be Deploying</a>. ("Coffee is for committers!")</div><div style="background-color: white; color: #222222;"><br /></div><div style="background-color: white; color: #222222;">Here's a partial list of strategies we came up with to make this work, most of them drawn from the <a href="http://www.startuplessonslearned.com/" style="color: #1155cc;" target="_blank">lean startup movement</a>:</div><div style="background-color: white; color: #222222;"></div><ul style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;"><li style="margin-left: 15px;"><a href="http://www.startuplessonslearned.com/2011/09/power-of-small-batches.html" style="color: #1155cc;" target="_blank">Work in small batches</a>: smaller changes are less likely to cause a disruption, and are easier to pinpoint when they do cause problems.</li><li style="margin-left: 15px;">Don't take shortcuts: skipping tests and hacking things together ultimately add unacceptable risk and technical debt.</li><li style="margin-left: 15px;">Practice <a href="http://blogs.hbr.org/2010/04/the-five-whys-for-startups/" style="color: #1155cc;" target="_blank">five whys/root cause analysis</a>: don't make the same mistake twice; gradually develop a cluster immune system</li><li style="margin-left: 15px;">Expect 100% unit test code coverage, backed by appropriate integration and feature tests: catch problems as early as possible</li><li style="margin-left: 15px;">Setup a <a href="http://www.martinfowler.com/articles/continuousIntegration.html">continuous integration</a> server: we have too many modules for any one developer to test all of them at once, so this server will become a backstop, alerting us when there is a problem in one of our modules.</li><li style="margin-left: 15px;">Use <a href="http://playbook.thoughtbot.com/validating-customers/feature-flags/" style="color: #1155cc;" target="_blank">Feature flags</a>: while we are testing new features, hide them from users until they are fully baked.</li><li style="margin-left: 15px;">Build staging environments that make it easy for developers to double-check their work</li><ul><li style="margin-left: 15px;">Since we're on Heroku we plan to use their awesome <a href="https://devcenter.heroku.com/articles/labs-pipelines" style="color: #1155cc;" target="_blank">pipelines lab</a> for this</li><li style="margin-left: 15px;">We can also <a href="https://devcenter.heroku.com/articles/heroku-postgres-fork" style="color: #1155cc;" target="_blank">fork our database</a> to create a sandbox for features that depend on database changes</li><li style="margin-left: 15px;">This should never be construed as a required step before code can be released to production</li></ul><li style="margin-left: 15px;">Code reviews</li><ul><li style="margin-left: 15px;">Two times a day I review every commit in our system, really helps spot issues before they become problems</li></ul><li style="margin-left: 15px;">Build <a href="http://widgetsandshit.com/teddziuba/2011/03/monitoring-theory.html" style="color: #1155cc;" target="_blank">informative, actionable alerting systems</a></li></ul><div style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;"></div><div style="background-color: white; color: #222222;"></div><div style="font-family: arial, sans-serif; font-size: 13px;"><div dir="ltr"></div></div><br /><div style="-webkit-text-stroke-width: 0px; background-color: white; color: #222222; font-family: Times; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; margin: 0px; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;">What else should we add to the list?</div>Mike Subelskynoreply@blogger.com3