The only constant you should hold in life is change. If you hold change as a constant, you will learn to adapt and manage life’s complexities well. Your software should reflect this principle and allow itself to evolve and adapt. It’s essential to keep things simple while also ensuring that you can adapt the system to the inevitable yet unpredictable future. A simple system is easy to evolve.
Complexity in any system is what creates defects. Developers are easily able to reason about a single unit of code or even sometimes, a simple component.
If that is the case, then why are defects understood to be a natural part of software development? There are two causes of this: intricate integration patterns and state.
Most systems of non-trivial scale have multiple components or layers within them. Each one of these components or layers becomes its context.
Occasionally, and a lot more often now than in the past, these components communicate to external systems as a means to integrate third-party functionality.
Each one of these components has its interface and boundaries that define it.
For some waking up early and working out feels right. For others maybe it is a midday stroll around the neighborhood.
Everyone has a preference. There is no right or wrong answer. The main point is to have a strong foundation of how your day will be structured.
Build a system that works for you and only you.
There is a common thought in entrepreneur circles that greatness isn’t defined by what you say yes to, but what you say no to. This rings true in many domains but in software it can become a way of life. In software, the build vs buy challenge is fraught with strong opinions either way. There are a lot of incredibly smart engineers that can build almost anything given the right resources.
Abstraction is a powerful tool. Some of the greatest inventions in technology: operating systems, programming languages, compilers, etc. are abstractions. However, when misused or misunderstood, they can be destructive.
Over abstraction can create unmaintainable, untestable monstrosities. Under abstraction may mean duplicate code, but duplicate code is almost always better than unmaintainable code.
Most personal development books will tell you to set goals and work towards those consistently.
Consistency forms habits and creates progress towards goals no matter how small.
There’s an often-quoted statistic that if you do 1% a day or get 1% better you are 37.78x closer to your goal or improved as a person.
Sales is a numbers game and a tough game. Most of the time we are getting told no or even worse getting nothing back.
“Hello? Is it me you’re looking for?” Nope.
In software and in life, you are what you measure.
If you measure velocity, your team will optimize for delivery. If you measure code quality, you will optimize for that.
You must have both measures and countermeasures to ensure that teams stay on track and don’t stray too far in one direction.
Your time is limited, and because of this, you have limited things - whether that is money, achievement or in the case of software: features, documentation, tests, etc.
You must pick what is important to you and work on that. This means choosing the most needed features, the most impactful tech debt, and the most critical tests.
Software Principle 2: Always understand your context
There are two keys to successful execution: knowing what to do and understanding the environment or context. If you have those two things, you are sure to have success.
However, as everyone is aware can be insanely difficult. If what you are trying to do is incredibly difficult, then there is an excellent chance you don’t know what to do. Conversely, if you are working in a chaotic environment, it is hard to understand your situation. That said, if I could pick one of those two, I’d always pick knowing my context. Context will help illuminate the problem and will let you know how to get the resources needed to discover what to do.
Software Principle #1: Earn your complexity
Complexity is everywhere. In every domain, under ever rock, lies something that requires years of experience to fully understand.
In software development, we learn about these complexities and try to model them using computer languages in our best guess efforts. The thing is though: very rarely are engineers domain experts.
Information technology expenditure worldwide is currently at 3.7 trillion dollars, with growth that outpaces the GDP growth rate of many nations [^1]. Digital transformation for businesses is targeted to hit 2.2 trillion dollars by 2022 [^2]. It has a daily impact on most, if not all lives, in all developed countries. Software is quite literally eating the world.
There is still so much incredible waste where in a recent study a staggering 68% of all IT projects fail [^3]. 70% of executives in the Fortune 500 believe that their technology projects will fail, and the sad part is that they aren’t wrong to believe that.
Sales Principle 3 of 10
In 1998, according to the Associated Press, our average attention span was around 12 minutes. A decade later, attention spans dropped by 50% to 5-6 minutes. I’ll bet they are about five seconds today.
There are many factors for the dramatic drop in these statistics. Social media is a huge culprit that has rewired our brains to make it more difficult to pay attention for long periods.
Sales Principle 2 of 10
When you first set your mindset to help your customers as I discussed in Sales Principle #1, then you are on a journey to immense success. To make the journey more enjoyable and sales less of a grind, I firmly believe being authentic and genuine are essential.
If you are a complete bozo, I’m not sure what to tell you. Hopefully, this article can help.
This is more about building real lasting relationships. None of that fake stuff. Keepin’ it real.
At Skiplist, one of our core values is “Relationships over Money.” Easy to say but very hard to practice.
Everyone at Skiplist profoundly believes in our core values. This is our differentiator and what makes working at Skiplist a blast.