Skills, Theories, and Methodologies Every Software Engineer Should Know

(at least at our company. Mileage may vary.)

We have a lot of different specialties at our company. Backend, frontend, mobile, machine learning/AI, etc across many different languages and frameworks. However, regardless of specialty, there are some common skills, methodologies, and theories that every software engineer at our company should know; some core competencies1 Many of these do come with what we feel are fair assumptions (e.g. if you know how to fix rebase and merge conflicts in git, we feel it's safe to assume you know the basics of a git workflow).

Every engineer on our team has contributed to this doc and we welcome outside contributions. You can contribute on Github by submitting a pull request2.

Tools and skills

  • Unix Basics and Command Line Tools
  • Proficiency in at least ONE CLI text editor (nano, vim, etc). Absolutely necessary to manage, debug, troubleshoot (and more) remote servers. We're partial to vim, but pick your poison.
  • Version control, specifically the ins and outs of git
    • git workflow
    • Tig command line tool
    • Advanced checkouts (to specific commits, HEAD, etc)
    • Cherry picking in git
    • How to fix merge conflicts, how to fix rebase conflicts
    • merge vs rebase
    • How to read code and identify good/bad code
    • How to read documentation and debug
    • Small note on this: Google is not bad. Google is your friend. HOWEVER, and this is a big "however," Google to understand the core reason your code is failing. Do NOT Google just to copy and paste someone else’s fix. If you work with Ruby, understand what causes a NoMethod Error on a nil object for example. With Javascript, understand what causes the object to be undefined. With Python, understand a TypeError: 'str' object is probably because strings are immutable data types. Et cetera. Understanding errors and why they commonly occur, will make you a better programmer, better at debugging, and give you more insight into the language/framework.
    • Same goes for documentation: Documentation almost always > tutorials. Tutorials are great to get the basics of something up and running, but they often skim over the why something works the way it works.
    • How to contribute to open source *How to use and organise tasks on Trello (or similar Kanban system if we end up changing)
    • Semantic Versioning (
    • Data structures and algorithms
    • Good understanding of matrices and matrix manipulation in whatever language you are writing in. Particularly if interested in ML & AI you really want to understand how to manipulate your data.

Basics of Docker


Principles and theories

  • Understand basic OO Analysis and Design
  • Understand the SOLID principles
  • Understand Design Patterns
  • Understand Basic Architectural Patterns
  • Understand the KISS principle
  • Understand the DRY principle and practice it every day
    • Ask yourself, will this action be done more than once? This does not just apply to a program, this also applies in the workplace! In the ML, AI and Robotics lab, a recent one I saw was needing to list out all of the images that had been trained by the network, create a folder for those images, and put the images in said folder.

script all the things

This list will probably continue to grow. I'm sure we missed some things. You can contribute to the list by submitting a pull request on Github or in the comments below.

  1. We should also point out that this list is probably not complete and will continue to grow. This is certainly not a list of the only things a software engineer needs to know; just the things they should know.

  2. This file lives in a repo where we have began to build collection of resources useful to our company and, we believe, to other startups as well.

Download our Incubator Resources



We’re known for sharing everything!


Save more time, get more done!


Innovate from the inside

Written by
Cody Littlewood 24 Nov 2015



comments powered by Disqus