Technical New Year's Resolutions: 2015

Well, 2014 is on the way out.  What a year.  I like to do these posts every year to reflect on the passing year, and set some goals for the next.

Let's reflect on my resolutions for 2014:

  • Ship great products:  I did a lot of this in 2014.  Between some sizable new features at CrowdTwist, some major new additions at ShootProof, and additional features being added to my iOS app, FloodWatch, I'd say that I shipped quite a bit this past year.  Ninety percent of my focus continues to be on the web application side of things, which is still a ton of fun.
  • Find fun and satisfaction in all that I do: I joined ShootProof in July, which spoke directly to this goal.  I've found working in a smaller team to be much more satisfying, and our team is incredible.  It's truly a joy to go to the office everyday; I believe in the team and the direction we're headed.
  • Say "no" more: I've done a good job on this, being sure not to bite off more than I can chew.  As a result, I've been largely absent from blogging, speaking at conferences, and writing articles.  This is a bummer, but has been necessary to keep a good balance.

Now, what to tackle in 2015?

  • Continue to help propel ShootProof forward: we've got a lot of great things in store for 2015, and I'm so thrilled and honored to be a part of it.  I'm going to keep giving 110% so we can keep improving our products, and further solidify ourselves as the most comprehensive online solution for photographers.  It's been a great six months, and the next 12 are going to be incredible.
  • Continue to improve FloodWatch: my little iOS app, FloodWatch, has been near and dear to my heart since I started on it in early 2010.  With over four years in the iOS App Store, it still continues to be discovered and useful to thousands of people throughout the US each year.  It's not super lucrative, but there are a few more key features needed for it to reach its peak utility.  I plan to add some features early in 2015, and ultimately want to feel 100% satisfied with its feature set in the coming year.
  • Blog and/or speak more: I've done a lousy job of this in 2014, as exhibited by the fact that I published two posts last year.  It's so easy to write, yet I've failed to make it a priority.  This has to change in 2015.  Less talk, more action!  I also need to speak a time or two, either at Atlanta PHP, or maybe even a PHP-centric conference.  It's been far too long.
  • Launch a new iOS or Mac app: I'd like to branch out a bit in 2015, hopefully launching a second iOS app, or my first Mac app.  I continued to find this to be an enjoyably platform in which to work, mainly because it's so vastly different from web development.  The introduction of Apple Watch also seems to be a great opportunity on many levels.  I'd love to attend WWDC, too.

On a personal note, 2015 should finally bring about my jaw surgery where my underbite will be corrected by moving my lower jaw backward, and my upper jaw forward in order to close the discrepancy with my bite.  This will involve a few months-long recovery process, but it is a worthwhile pursuit in terms of my long-term health.  I'm not looking forward to the procedure, per se, but I am looking forward to it being over and having recovered.  This past year was quite disappointing on this front, due my experience with an unethical and irresponsible Atlanta-based oral surgeon's office (more on that later).

I'm also looking forward to finally having flying cars, Hoverboards, and food rehydrators.

Happy New Year!

Joining ShootProof

As of today, I'm joining my friends at ShootProof as Director of Engineering.

My move to ShootProof is about getting back to what I love most: building products.  I'm looking forward to working with a small team in a nimble environment.  iOS and web development, infrastructure, technical leadership ...all of my skills are going to go to good use at ShootProof.  I'm thrilled to be embarking on this journey with them.

In addition, I get the added benefit of working with some of my most favorite developers ever: Robert Swarthout and Ben Ramsey.  The three of us worked together at Schematic (now POSSIBLE) on our Atlanta-based Open Source Platforms Group team (essentially, the PHP team).  I also get to join the ranks of many others that I'm excited to work with, such as Kevin Bandy, Terry Allen, and Colin Breece.  The entire team at ShootProof is incredible -- A+ players.  I'm going to learn an enormous amount from this team.

I've enjoyed the past two and a half years at CrowdTwist, and I believe I've made a positive impact on the business.  I've refactored some core areas of the platform, built a number of significant features, and just generally had a hand in many significant advancements during this time.  I've also helped grow and lead the development team in many ways.  I've gained so much from this experience; it's allowed me to further my skills and career in many ways.  It's truly been an incredible ride, and I depart very proud of what we've all accomplished together.

The ShootProof team is going to continue to impact the lives of photographers around the world, and I'm very proud to have a chance to make my mark.  Buckle up.

Technical New Year's Resolutions: 2014

In reviewing my 2013 Technical New Year's resolutions, I give myself a solid B-, maybe a C+.

I've been completely slammed and overwhelmed with my day job at times, which has contributed to my lack of focus on things outside of work. It's also worn me down at times, and left me with little motivation. That's no excuse, but a human being can only take so much.

If I reflect on my goals...

  • I did some more speaking, this year at Atlanta PHP, CoderFaire, and Emory University.
  • I built some great software at work, which I'm really proud of.
  • I shipped some decent updates to FloodWatch, but not a major 2.0 version. However, I will ship a major update (with iPad support) to it in the first few days of 2014, so this goal is 75% complete.
  • I didn't blog much at all, which is disappointing. This one evades me every single year. I need to be better about it.

So for 2014, I'm keeping it simple:

  • Ship great products: Nothing else matters. I'm going to ship the best stuff I can all year, both at my day job, and in my spare time.
  • Find fun and satisfaction in all that I do: Not all work is fun all of time (which is why it's called "work"), but I need to strive to find positives in all that I do, or if I can't, cease doing them. If it's not fun and satisfying in some way, then it's not worth doing. Period.
  • Say "no" more: I'm a chronic overachiever who tends to overcommit myself. This year, I'm going to guard myself from being overcommitted. If I can focus on the goals above, shipping and focusing on enjoyable work, then this should be easy.

Wish me luck. Happy New Year! 2014 is going to rock.

Top Ten List + CoderFaire Atlanta 2013

Back in March, I gave a new talk at Atlanta PHP: "Top Ten List: PHP and Web Application Performance". This talk is a culmination of my ~14 years of experience primarily as a web application developer, but also as a systems administrator / DevOps-type.  After working with PHP and web applications for so many years, I have amassed quite a few tricks for squeezing maximum performance out of web applications, PHP or otherwise. I'll be presenting it again at CoderFaire Atlanta on April 20, 2013.  CoderFaire is organized by a fantastic crew of Cal Evans, Kathy Evans, Chris Spruck, Kevin Roberts, and Jacques Woodcock, so it's going to be a great event. I've never attended a CoderFaire event before, but I've only heard positive things. Because it's not limited to a single technology platform, you're sure to meet a wide array of technical minds from all different backgrounds. I'm sure we'll all walk away with some fresh, new ideas from this diverse crowd.

At only $50 per ticket, you're not going to find a better deal on a technical conference this year. Register now!

As a little teaser, here are each of the 10 guests introducing the topics.  Come on out for the juicy details. Be prepared to go home, sit down, and optimize some aspects of your web application, though!  See you there.

10. Elizabeth Naramore, GitHub: Tweak your realpath cache settings

9. Scott Rocher, Tonx Coffee:  Whenever possible, use offline processing

8. Matthew Turland, Synacor: Write efficient SQL queries

7. Scott Lively, 3SI Security Systems: Don't execute queries in loops

6. Jed Lau & Maggie Nelson, Findery: Know what your application is doing

5. Robert Swarthout, ShootProof: Use gzip compression on responses

4. Ian Myers, Findery: Do not use .htaccess files

3. Ken Macke, RockIP Networks: Cache all the data that you can

2. Davey Shafik, EngineYard: Use a content delivery network

1. Ben Ramsey, Moontoast: Use APC and set apc.stat = 0

Technical New Year’s Resolutions: 2013

I try to do this every New Year's Eve, so I'll give it a whirl this year.  First, a little reflection on 2012's resolutions.

  • I did okay in 2012. I failed to actually release FloodWatch 2.0 (for iPhone and iPad), but I've made some great progress in the last quarter of the year, so I should be able to release it in Q1 2013.
  • I failed to blog more. Big time. I've just been so busy with work that I haven't made it a priority. I've already got a post ready for 2013, so I'll publish that in the coming days.  Must stay devoted to this.
  • I've not done much with front end technologies in 2012, sheerly because we're on specialized back and front end teams at CrowdTwist.  While I'm bummed that I haven't done more front end work this year, it's nice to have been so focused on PHP and server-side code all year.
  • I did gain a lot of exposure to PHP 5.3 and PHP 5.4 changes, so that's been great.  I've spent a decent amount of time on the systems administration side this year, as well as helping craft and refine our back end toolset at work, too.  I also submitted and helped resolve an APC bug this year, which the CrowdTwist team looks forward to being included in the 3.1.14 release.

I've built a lot of great application components in PHP this year -- definitely one of my better years with many projects to reflect on.  I'm very aware of how my architecture and implementation skills have improved with time and experience.  I'm building things that I'm genuinely happy with the first time around.  CrowdTwist has been incredible, and 2013's going to be a huge year for us.  Look out!

Here we go for 2013.  I'm keeping it simple so I can focus on these few things:

  • Blog more: I've failed so miserably at this in years past.  I'm going to make a concerted effort to blog more in 2013.
  • Get back to speaking: I spent a good few years on the conference circuit, but not so much since I became a parent in 2009.  I'm speaking at Atlanta PHP in March, so that's a start.  I'm going to try to submit a proposal for php|tek in May 2013, since that's thee conference to attend.
  • Build more great software (at work, primarily): we're working on some incredible projects at CrowdTwist.  I want to continue to give a 110% effort all year long, helping architect and build components that I'm proud of.  Watching something you built function in the real world under high traffic is such a gratifying feeling; there's nothing like it.
  • Actually release FloodWatch 2.0 for iOS: this will be doable for sure.  I'm just taking my time, paying attention to the details.  Building and maintaining my app is a great exercise in helping broaden my skills beyond PHP and open source technologies.  I've enjoyed every minute of it, and really look forward to refining these skills in 2013.

2013 is going to be a wild year!  Bring on the journey.

On to CrowdTwist

TL;DR: I'm making a move to CrowdTwist, a New York City-based startup providing social and loyalty services for some of the world's biggest brands. I worked with their co-founder and CTO, Mike Montero, from 2001-2005 at Community Connect Inc., where I got my start as a developer in PHP and open source tools. I'm thrilled to be joining him and the CrowdTwist team on what's sure to be an incredible adventure.

Back in 2001, I joined Community Connect Inc. (now Interactive One) as a Senior Network Support Specialist. I was an internal sysadmin, spending my time managing Linux-based file servers, development servers and things of that nature. I had been living in New York just a few short months.

CCI operated what were, at the time, some of the most highly-trafficked social networking sites on the Internet. This was before MySpace and Facebook, of course. was one of the mostly highly-trafficked PHP-based sites on the Internet. We were doing an insane amount of traffic. Our applications had to perform well and scale. We had no choice.

Even as a sysadmin-type, I was surrounded by some incredibly talented developers, who were all working with PHP on Linux and Apache using Oracle. There were caching, using CDNs, and doing things that were still relatively new on the Web. I caught the development bug. I started writing code in my spare time, taking on little projects on the side. How could you not get totally infected in an intense, exciting environment such as this?

In early 2002, I received a call out of the blue from my boss (also our CTO), Mike Montero. On that call, he asked me if I'd be interested in moving to the CCI development team. There was only one way to answer: "YES!"

Thus, in early 2002, just about 10 years ago, I became a developer. The most lowly of the low -- "Associate Software Developer." Over the next three and a half years, I worked my way up to Technical Lead, learning a ridiculous amount from my colleagues. I had amassed this strong set of experience in systems administration and development. I was really growing my skills, and I loved every second of it. I worked many late nights and weekends...and it was an absolute thrill.

Our work was literally being seen by millions of users every day. We were building quality products, all on a home-grown internal framework of sorts. We were doing code reviews. We were writing unit tests. This was how software was built. I never knew any lifestyle but this -- it was my first development gig! This was just the way things were done. This period of time really shaped my personal stance on how to build quality software that was both performant and scalable. I consider myself so very fortunate to have started with this level of experience. It's what gave me such a strong base of experience as a software developer.

In mid-2005, I moved on from CCI and spent almost five years in an interactive agency, Schematic (now Possible Worldwide). During this time, I gained exposure to new, different technologies like Zend Framework and Memcached. This was my first foray into leading major technical projects for clients, but still rolling up my sleeves, diving into architecture and code. I was using my skills from CCI with PHP, sysadmin duties, and databases, and applying them to client work time and time again. I was working in a world that was very different from what I had known at CCI, but bringing so much of that experience forward with me. In mid-2007, we moved to Atlanta, where I stayed with Schematic.

After almost five years at Schematic, I moved on to Yahoo! for a little over a year. This allowed me to get back to my development roots, focusing solely on code and architecture. I had a great time.

In mid-2011, I made a move to Half Off Depot to build an internal development team and grow the technical side of the company as Lead Software Architect. Here, I've was using all of my skills: systems administration, PHP, MySQL administration, managerial duties, recruiting, and working with other departments, such as marketing and design.

Over the past eight months, I've made a huge impact at Half Off Depot in terms of stabilizing the application and its Production environment. I've branched out into using Git and GitHub, Capistrano and Amazon Web Services. I've also had the opportunity to continue sharpening my Objective-C and iOS development skills. Overall, Half Off Depot has challenged me, and I've enjoyed it. I've reaffirmed to myself that I've got a breadth and depth of skills, and that I'm still pretty sharp with all of them. It's also reminded me how much I enjoy a startup environment.

But about a month ago, Mike Montero came calling again -- this time, with an opportunity for me to join CrowdTwist, a New York City-based startup where he's a co-founder and CTO. CrowdTwist is an emerging, unique player in the loyalty space. Think "platform as a service." APIs, user-facing sites, large amounts of data. And an incredible team that's tapping into this data to provide real value for their clients.

When someone you trust and respect comes calling and seeks you out, you listen and explore. And that's exactly what I did. And let me tell you, the CrowdTwist team is INCREDIBLE. I could not be more excited for this career change, both for the opportunity to work with Mike once again, but also to work with all of the brilliant team members and their clients.

I'm in a unique position where I had almost five years of CCI-level experience, coupled with seven years of experience since then. Now I'm going back to work with Mike and the CrowdTwist team, where I'll be able to bring my strong foundation from CCI, along with all that I've learned in the years after CCI. My career has come full circle with respect to the last decade.

I typically like to make a job change, then stay there for at least four years as I did with CCI and Schematic. However, this opportunity with CrowdTwist is so rare that I had to take it. To be with this caliber of talent in such a promising space where they're truly a pioneer? You just don't say "no" to that. Or if you do, you regret it in a few years when they've been wildly successful.

So, on March 12th, I'm joining CrowdTwist full-time. I'll be working remotely from Atlanta, but traveling up to New York City from time to time. I'll be focusing on a mix of back end development and architecture, systems administration, and helping the team continue building quality software.

To my Half Off Depot colleagues, it's been incredible! We've done some great things together. I wish you all the best of luck. Also, this has easily been one of the best team of technologists I've ever worked with. Thanks, guys.

To my future CrowdTwist colleagues, thanks for welcoming me! I'm so thrilled at the opportunity to join you. This is going to be an incredible ride. I'm ready to rock.

See you soon, CrowdTwist! And if you've read this far, thanks. :)

Technical New Year’s Resolutions: 2012

I like to do this every year. It's a reflect and reset-type of thing for me. Here's what I accomplished from last year's resolutions:

I'll keep it short. This year, I want to:

  • Finally release FloodWatch for iPad and Mac. I've already started the static library. This should be done in the first half of the year.
  • Gain a deeper knowledge of PHP 5.3 and 5.4 features, such as namespaces, closures, and traits.
  • Beef up my front end development skills. I've done front end work for months at a time, but never for a long period of time. When I take on this kind of work, I enjoy it, but I want to do more of it in a focused manner. Front end development skills have been my area of weakness for my entire career. I'm a back end kind of guy.
  • Refocus my technical leadership skills. I've led a number of large projects during my career, and I'll get to do more of that in 2012. As a result, I look forward to really sharpening my technical leadership skills with respect to architecture, technical project management, and driving teams of incredibly talented developers.
  • Get back on the conference circuit. For real this time.
  • Blog more. I've started getting back to this recently. I'm going to stick with it.

From where I sit, 2012 is going to be incredible. 2011 was great, but I've got my work cut out for me this year. It's going to be a wild ride. See you around!

What are you going to do in 2012?

Magento for Big Kids: Use a Consistent Cache Key Prefix

This is the first in what I hope to be a multi-part series on using Magento.  I've been working with it since June to run one of our core sites at Half Off Depot. During these six months, we have:

  • Built an incredible team
  • Had our application servers swap to disk and otherwise go belly up, on numerous occasions
  • Moved from FastCGI back to mod_php
  • Tuned Apache a bit to squeeze more out of our application servers
  • Moved from a single front end webserver to multiple
  • Introduced MySQL master-slave replication, when the slave actually in use -- it's not just a hot backup
  • Crafted a respectable Magento application deployment process using Capistrano
  • Cranked out some basic Magento extensions
  • Run countless sales, built mobile apps, launched new web applications and a private API

I don't claim to be a Magento expert after only six months (far from it), but I / we have learned a lot during this time.

In this first post, I'm going to unveil a handy tip:

Always use a consistent Magento cache key prefix.

This can be done in your app/etc/local.xml file like so:


Magento performs poorly out of the box.  The crux of this is that its database is based on an Entity-Attribute-Value (EAV) data model.  Using APC is basically a requirement if you do any reasonable amount of traffic, too.  Big red flags, right? Anyways...

It also uses an aggressive caching model for things like:

  • Front end layout
  • Blocks of HTML used to render pages
  • Magento configuration data (because many core application config options are stored in the database)
  • Translation data
  • Full page cache
  • EAV types and attributes

Because we run on multiple front end web servers, we have to have a centralized cache.  We use Memcached for this. For example, if someone alters a product in our admin tool, which purges the cache item, the refreshed cache item needs to be available to all front end web servers at the same time. An inconsistency between our front end servers is not acceptable. Hence, the centralized cache.

When using Memcached, Magento uses Zend_Cache_Backend_TwoLevels under the hood because it has to maintain a mapping of cache type to the cache keys that make up the data for that type of cache. For example, you should be able to purge the layout or block cache without purging the entire set of cached data.  There's no sort of partial cache purge out of the box possible with Memcached.  You either mark all items invalidated, or delete what you want to, one key at a time. In our case, the mapping of cache type to its keys is stored in our MySQL database. That's not ideal, is what it is for now.

But, here's the catch: Magento / Zend_Cache prefixes all cache keys.  If you don't define a cache key, Magento uses one that is formed with:

  1. Absolute path to your app/etc/ directory
  2. MD5 of this path string
  3. First three characters of the MD5 hash value

This makes all the sense in the world, right?  Maybe it does for some, but it doesn't for us.  We run one web site driven by this single Magento instance.

But, we also have a deployment process centered around Capistrano.  What does this boil down to?

  1. Code releases are kept at /foo/bar/site/releases/[YYYYMMDDHHIISS] of when the code was deployed
  2. /foo/bar/site/current is a symlink to /foo/bar/site/releases/[YYYYMMDDHHIISS] of the most recent release

So, as we deploy code, the absolute path to the app/etc/ directory on disk changes!

Thus, when we deploy a new release, we get extremely high cache churn -- the absolute path to the app/etc/ directory has changed because we move that current symlink!  We basically were rewriting all of our cache with every release, clobbering our Memcached instances and database.

We had to take the site down for a minute or two and refresh the cache in a controlled environment without many concurrent requests taking place. Once the cache had been warmed by a single user, all worked well once again.

Why not, say, throw an exception and barf all over the developer? Or provide a reasonable, consistent default value? Don't change it as filesystem changes occur. That's not intuitive at all. If you're running multiple sites and need a separate cache prefix, you're probably advanced enough that you've considered the implications of your approach already anyway.

So, what's the lesson here?  Define your own Magento cache prefix to ensure that it never changes.

Hope you find this helpful! Here are a few more topics that will be coming soon:

  • Deploying Magento to multiple web servers with Capistrano
  • Centralizing your /media directory
  • Don't touch Core!
  • Abstraction is for wimps: query the database yourself

Making a move to Half Off Depot

I'm happy to announce that I'll be joining Half Off Depot, LLC as Lead Software Architect on June 27th. Half Off Depot is a growing, promising startup here in Atlanta. As you might gather from the name, they're in the daily deals space, sort of along the lines of Groupon and LivingSocial. As of this writing, they have been focusing on the Atlanta, Georgia and Knoxville, Tennessee markets.

I'll be focusing on a number of areas, both server-side and in the mobile app arena, in addition to helping build the technology team.

This was not an simple decision. I've been in a Senior Software Development Engineer role at Yahoo! since April 2010. During the first decade of my career, I spent over four years at both Community Connect Inc. (now Interactive One) and Schematic, Inc. (now Possible Worldwide), both in senior-level roles. It's not my style to leave a position after just over a year; I'm much more of a long-term kind of guy. However, as I got deeper into Schematic, I took on much more technical leadership where I was leading projects and directly managing developers, but haven't done a lot of that at Yahoo! yet. I'll be able to tap back into that wider range of my skills at Half Off Depot.

My transition to Yahoo! was really about focusing on my passion: architecture and development. Yahoo! has afforded me some incredible opportunities, especially when it came to exposing me to more technologies outside of the PHP and open source tools I've worked with over the past decade.

Specifically, I've spent a lot of time with Objective-C, Apple frameworks such as UIKit and AppKit, Hadoop, some Microsoft Mediaroom, and even client-side technologies. Yahoo! has really helped me expand my skill set and grow as a developer. I've worked with some incredibly talented, experienced developers. It's been an amazing ride. I'm going to miss it!

But, startup life came calling, and it was time to answer. I could not be more excited to join the Half Off Depot team, and I wish my Yahoo! colleagues the best of luck. If you ever get the chance to work at Yahoo!, take it!

This is going to be an incredible journey -- I can't wait to get started. Stay tuned! You'll be hearing more from me in the weeks and months ahead, especially as I begin to focus more on PHP, the web, and native mobile application development.

Technical New Year's Resolutions: 2011

Better late than never, right? I should've done this in December, but at least it's only two weeks into the New Year.

Last year was a great year. Looking back at my 2010 resolutions, here's what I accomplished:

  • Learn a new language -- really dove head first into learning Objective-C, along with the Cocoa and UIKit frameworks
  • Built and released my first iOS app, FloodWatch

My 2010 resolutions aside, I also managed to make a move to Yahoo!, start to hone my front end developer skills, do some Java work, learn some Hadoop and Pig scripting, learn some Lua, and speak at BarCamp Charleston. It's been a busy year!

I've been absolutely horrible at blogging over the past year, though. Two posts in 2010 is just pitiful and sad. Shame on me.

So, given the look back and the year ahead, here's what I'm challenging myself with:

  • Blog more: This is the biggest resolution of them all. I really need to write a few blog posts a month on whatever it is that I'm working on, when I might have something that can and should be shared with a larger potential audience. More often than not, I complete my tasks at hand and charge ahead to the next ones. I need to take more time to stop, reflect, and share.
  • Speak at more user groups and conferences: ...this is already in the works, too, with my first 2011 talk at Atlanta PHP on February 3, 2011. I'll be talking on the Yahoo! Query Language.
  • Write another article: ...already in the works! Look for it later in the year.
  • Continue to sharpen my development and architecture skills: I've learned an amazing amount of new things during my time at Yahoo! I work with some ridiculously smart people, and am constantly learning from them and becoming a better developer because the people in my environment. I'm loving every single day in the office where I get to focus on code and architecture. This one should be a breeze.
  • Read some of the classic programming books again: Classic books like The Pragmatic Programmer and Code Complete are great to read every few years to keep yourself grounded and humble. This should be one of those years for me.
  • Build another app of some sort, iOS, Mac or otherwise: ...have some ideas here, should be totally doable.
  • Spend some more time with PHP: I haven't written much PHP since mid-2010, so it'd be nice to get back to it. I should contribute to Zend Framework, etc. -- that'd be a great way to achieve this goal, while contributing to the community at the same time.
  • Get back on the conference circuit: I didn't do so well with this in 2010, mostly due to my job change. I'd like to get to at least one PHP, OSS, or development conference in 2011.

So, that's what I'll be doing in 2011. Hopefully I'll be here about 50 weeks from now, recounting how I knocked out every single one of these.

What are you doing in 2011?