In the context of software development, table stakes are processes that are essential for any successful software project. When any of these are missing, you should really question if the folks running the show know what they are doing.


There is no excuse for not using source code control. In fact, I’d go so far as to say that there is no excuse for not using a distributed version control system like Git (or Mercurial if you prefer). Invest in good source code control. If your team resists team-wide source control, use Git on your local machine until you can find another job.


Do yourself a huge favor and do not put binary library packages into your source code control system. There are some great dependency management systems out there like Maven or Ivy or CocoaPods or NuGet that are much better for this type dependency management in many cases.


Continuous Integration (CI) is a process that pulls the latest source code and completely builds the system on regular intervals (typically on each source code change). This requires a few key things that are almost table stakes on their own: a self-contained build process, some basic “smoke” unit tests, and a dedicated build server.

CI helps catch build issues quickly, especially if you have multi-platforms or multiple targets. It’s typical that the continuous integration build catches all those pesky “it only builds in debug mode” errors.


I can’t add too much to the discussion about unit tests. They are super useful and you should have a framework in place so that you can write them and run them during CI builds. Without unit tests, it’s much more difficult to do refactorings.