What are the Fundamentals?

If you don't have fundamentals that you can describe, practice, and measure, how do you know if you're getting better?

As an industry, we can't describe our fundamentals. Professional athletes have skill drills, and practice things like dribbling or shooting. Musicians have chords. Chefs have knife skills. All other creative professionals have fundamentals they attempt to improve to perfection. Sit down and think about it for a minute. What would you say are the fundamental skills of software engineering?

If you don't have fundamentals that you can describe, practice, and measure, how do you know what to practice, how to get better, or if you're any good? And if you don't know if you're good at the basics, how do you know whether or not you're ready to tackle more advanced concepts? (Never mind that this begs the question, what are the more advanced concepts?)

This is something I'm addressing. I believe there are 5 core activities that software engineers perform that make up the first tier of fundamentals:

  1. Technical Specification
    Turning product designs and descriptions into what must be implemented technically, including technologies and architecture, both at the micro and macro level. Many will reflexively cringe at this and assume this means big design up front, but I’ve found that taking some time to sit and think before implementing results in dramatically better outcomes.
  2. Specification Review
    Reviewing a technical specification in order to best assess it's viability and where it may have holes.
  3. Code
    As an industry this is the one we spend the most time thinking about, especially at the more junior levels. Fingers to keyboard cranking out code. Of the 5 fundamentals this one is the easiest and least valuable comparatively in most situations. That said it leaves plenty of space for improvement.
  4. Code Review
    The process of reviewing written code to find defects, increase the readability and maintainability of the code, and gain understanding of both the domain and how you're technically addressing the domain as a team.
  5. Debugging
    The process of finding, and patching defects. Of all of the fundamental skills this is the one that I've found most software engineers have the greatest difficulty in even attempting to articulate, and one that like the ability to create a technical specification really delineates the skill level of an engineer.

Much ink, physical and digital, has been spilled attempting to address each of these areas but few have attempted to consolidate and codify as to how best measure and improve them. Fewer still have developed a method to unify them.

If you're interested in learning more about these five fundamentals and how to measure and improve them sign up for my newsletter.