I’ve written a lot about the challenges of estimates, which may have given the impression that I think they’re useless. They aren’t. Well, not entirely anyway. I think the process of creating estimates is incredibly valuable. Let’s look at all the things we have to think about when creating an estimate: What is the complexity of the work? What are the dependencies for the…
I’ve written about the technical challenges of coming up with estimates in software development before. What I’ve neglected to talk about is that one of the biggest problems with getting accurate estimates, particularly for large projects, isn’t technical. The biggest problem is getting to understand your user. Photo by airfocus The idea that you can get accurate estimates for a…
Photo by Andrew Neel There was a time where most software was built under the waterfall model. You gathered requirements, then designed your system, then wrote the code, shipped the code to QA, then shipped the code to customers. A nice perfect assembly line. Except software development isn’t an assembly line. When you get a physical product off an assembly line, you can’t just go…
I’m going to start this off by saying that I think JIRA is an ok tool. Good project management requires some visual tracker on progress. Most people are visual thinkers and while daily standups are great communication tools for getting project status, they are more effective with some visual such as a JIRA board. The problem is when we start to over-value the JIRA board. The problem is when…
Programmers often joke that our job is mostly copying and pasting stuff from Stack Overflow. If that were true, we wouldn’t be one of the most highly paid professions. And the hiring market wouldn’t be as insane as it is right now. More often than not, the answer is not out there. A developer’s skills are put to the test when they have to implement something no one’s…
In 2014, I had been hearing a lot of talk about Go. It sounded like a really exciting language that I wanted to try. Having learned to code in Java and spending my early career working in Java, I was used to complex inheritence hierarchies and many many layers of abstraction. The notion of NOT having inheritence was so out there. My gut reaction was to dismiss it. Photo by James Harrison
I first heard the term “10x developer” a decade ago. My initial reaction to the term was confusion. What does that even mean? That one person types code 10x faster than another person? Or completes 10x more JIRA tickets? Photo by Jon Tyson And if you’re using a descriptor of 10x, who is the base? How are you calculating what someone is being 10x of? At the same time, some…
Picture this: you’re a software developer at a small startup. A product manager just handed you some requirements for a new project. The project overall seems pretty simple. Roughly 2 weeks of work for the majority of it. However, hidden in those requirements is a single sentence that calls for concurrency. You’re going to need to coordinate data between multiple users in real time and…
Think about the last time you learned a skill. Were you awesome at it right off the bat? Or did you make a series of mistakes, learned from each one, and adjusted what you were doing to improve? Photo by Sarah Kilian Anyone being truthful would say the latter. A core part of learning is trying something new to see if it works. Most of the time, it won’t work. That’s ok.
I’ve written before about how I think college GPAs are a useless metric for hiring managers. It should come as no surprise that I don’t have a very high opinion of certifications either. Photo by unDraw I recently needed to hire an engineer with deep knowledge of AWS. Given the job description saying as much, I received hundreds of applications from folks with a variety of AWS…
Early in my career, I had the incorrect impression that interacting with customers was beneath me. I had this perception because I was at a large company and standard corporate hierarchies encourage that mentality. Photo by Petr Macháček As a result, it has become a pretty widespread idea in our profession. Even if people don’t say it, they act like it. Later in my career, I was asked in an…
I’ve written before on the problems of hero culture. It is still my favorite post that I’ve written because it hits so close to home for me. Photo by unDraw Every situation in that post is hypothetical, but based on a real situation I had to deal with myself. Unfortunately, that post is very light on the solution, despite the claim of it being easy. That’s because most of my…
Photo by Artem Maltsev Abstractions are a necessary part of software development. Not having them would make certain things ridiculous. Imagine building an e-commerce store for books and writing code for each title instead of just having code for the concept of “book” and reusing it for all titles. The very concept of a “user” in any application is also an abstraction. We…
Amazon Web Services went down last Tuesday. It doesn’t happen often, but it is a harrowing experience when it does. Understandably, people get angry during these times. They have come to rely on AWS to provide services necessary for their business. Who isn’t going to be angry when their business stops because of something they can’t control? My day job was certainly impacted as…
Concurrency is a notorious cause of really frustrating bugs. Most software bugs are consistent. If you do X, then Y, then Z, you get Bug A. You can get race conditions with concurrency though. That’s basically a bug where if you do X, then Y, you’ll get Bug A maybe 10% of the time. The occurrence of the bug is intermittent which makes it hard to find the root cause since you…
“It will be easier to get people to write automated tests if we make it easier to write the tests.” I hear this a lot. It seems sensible. It it also ineffective. The key to getting dev teams to write automated tests isn’t reducing friction. Friction isn’t the issue. It doesn’t matter if you can get things to a point where it only takes a few minutes to write tests for…
This is a conversation I had when I was interviewing a few years ago: Interviewer: “Yeah, a lot of candidates actually have trouble with this problem because it never shows up in the software we write.” Me: “…so why is it part of the interview?” Silence There is so much content out there right now about what candidates can do to “stand out” and…
There has been quite a bit of talk lately about how companies are moving to remote work. Some people even go so far to say that all companies should be remote. Having an office is just clinging to the past. The office is obsolete and remote work is the future we should have. I can’t disagree more. As far as software development is concerned, I think the most efficient teams in the future…
I find behavioral economics fascinating. Many economists assume rational behavior among all people and it results in economic models that seem good in theory, but end up being completely inaccurate. Humans aren’t 100% rational and the real decisions we make are difficult to account for. We have a similar problem when it comes to the software development process. A lot of it is designed with…
I find it distressing that more and more companies using personality tests in their interview process. My colleagues mentioned that they have seen this trend increase as well. They note that it is a convenient way to get around anti-discrimination laws because the results are hidden. I’m going to give a benefit of a doubt and not assume this practice is due to some sinister motive. I think a…
I’ve written previously about the dangers of high switching costs in software development. Being dependant on a third party is a huge risk. You are vulnerable to the whims of another company, including astronomical price increases. However, reliance on vendors is inevitable as they can significantly accelerate product development. Photo by Steve Johnson $500 a month for a third party SAAS sounds…
Estimates are inevitably going to become inaccurate. There are simply too many factors to take into account to create an accurate estimate in a reasonable manner. As much as we want to try and make our estimates more accurate, a better use of our efforts would be to look at how we handle things when an estimate is missed. Photo by Ugo Mendes Donelli The best way to handle a missed estimate is to…
Estimates can be useful when building software. There is the immediate comfort in having expectations, but there are also practical benefits. Estimates allow for the proper prioritization of work. We don’t just work on things that are important, we work on things that give us a good amount of value for the time we have to put into them. Photo by Mike Szczepanski Unfortunately, estimates are often…
What defines a software architect? It usually means someone has achieved a high level of technical skill. Most of the architects I’ve worked with have been quite good. They may spend a good portion of their day around whiteboards with various teams, but they also spend a decent amount of time writing code. Occasionally, I meet someone who has let the title go to their head. They view writing code…
All developers have to think about the reality that product requirements change. This is especially true for early products where user research typically needs to last past the first few releases. I’ve started to realize that one way to maintain a lot of flexibility is to minimize logic on the backend and keep things as simple as possible. An example of this would be: let’s say you have a system…
Best practices sound like a great thing. Why wouldn’t we want to make sure our software is the best it can be? How better to make it so than to use practices that everyone considers the best? This was something I was extremely concerned with early in my career. I’ve worked in a variety of situations: small companies to large companies, consumer products and B2B products, pure software companies…
A lot of factors are considered in a build vs buy decision. What are the technical capabilities of existing systems? Is the functionality a core offering of my own product? How complex would it really be to build? How much would buying cost? What about switching costs? One thing I find myself considering more and more is the philosophy of the people who are building the technology I am evaluating.…
Failing fast has become a common trope by now. It makes a lot of sense in some contexts. Fear of failing causes many problems, the biggest of which is being afraid to try something new. Even if a new thing only has a 1% chance of teaching you something useful, not trying gives you a 0% chance of learning something useful. Fear of failing prevents long term success. Overcoming this fear isn’t easy,…
It is hard to argue against writing tests. They save a huge amount of time relative to the how much effort it takes to write them. The increased quality of the product also makes a good impression with users. Yet all too often, tests are not written. Even for advocates of automated testing like myself, there’s either a temptation to skip writing tests “just this once” or “this feature doesn’t need…
When we talk about UX, we often refer to the UX of the products we build and use. We want our products to be easy to use. Interactions should be quick. Mistakes should be easy to recover from. These things are also good to have in the tools we use to build software, especially programming languages. I’ve worked in a fair number of languages: Java for almost 15 years, PHP for 8, Javascript for 8,…
I’m pretty skeptical of AI replacing humans anytime soon, but there is no denying that AI is capable of things that humans aren’t. Computers are unmatched in their ability to run brute force calculations. Theoretically, a human could perform Google’s PageRank algorithm. Yet, it would take a human millions of times more time than a computer to do so and the monotony would result in human error.…
I recently came across the need for a date/time parser that used natural language processing. Maleega’s date picker is extremely barebones and needed replacing. I left it barebones because I wanted time to figure out how to build a good date/time picker. Every one that I’ve used has felt clunky. This is probably because of the inherent challenges with date and time. There’s a lot of complexity in…
Abstractions are a critical part of software development. While we developers often abstract too much, software would take exponentially more time to build today without abstractions. Few write their own code to store data these days. We use databases instead. The same goes for web servers. And HTTP libraries. And JSON encoders/decoders. Like anything though, we can have too much of a good thing.…
There’s a lot of fear about AI replacing us humans, much of it around jobs specifically. History is filled with examples of jobs being lost to automation in general. While there was some suffering, society overall improved. Would you prefer to live in a world where a human has to operate an elevator for you? How many of you remember the long lines in the cash lane at toll booths? Roads will be…
I’m a big fan of automated testing. The math just works out. Why spend hours running a series of test cases when a computer can do it in seconds. With benefits like this, my zeal for automated testing can make it seem like I think that all testing should be automated. However, this couldn’t be farther from the truth. There is little room in software development for pure rote manual testing, but…
Cryptocurrencies have had a lot of ups and downs. A lot of questions have been asked about whether they’re actually viable or not. These conversations have been focused on the technical problems such as slow transactions, preventing the 51% attack, bugs in smart contracts, etc. Yet, solving technical problems won’t have as much of an effect as other factors. To understand those other…
There’s something deeply ingrained in many developers, including myself, that creates a tendency to over-engineer. Maybe it’s how we’re taught or maybe it’s a natural desire to “future proof” our code. Regardless, this tendency is so strong that even being aware of it is not enough to prevent the behavior. Earlier this year, I was working on a system for helping users filter their emails. While I…
Who writes code? The obvious answer is that developers write code. Who makes sure the code works? The answer to this question also seems obvious. It should also be developers… right? Fairly often, that is not actually the case. Many companies have separate QA departments that are responsible for making sure code works. Developers write code, then they throw it over a wall for someone else to test…
Automated testing is a wonderful thing. Think about it. Why spend hours, or even a few minutes, doing something that takes a computer less than a second. I’ve never regretted writing tests, especially after seeing the time to debug and fix bugs in a subsystem go from hours to minutes. Bug report -> investigation -> code fix -> test -> release, can all be done in under 15 minutes when automated…
I recently read a great article about procrastination. While the common viewpoint is that procrastination is a waste of time, it can also be a source of creativity. It reminds me of the classic advice when banging your head against a problem: take a break. Step away. Breathe. A year ago I started taking this advice a little further. If I am stuck with a problem, I put it off for at least a day.
I like to joke that one day I’m going to get a Phd in economics and make my thesis the cost to global GDP of the tabs vs spaces debate. There’s a great episode of Silicon Valley about it. Unfortunately, while the show does exaggerate some things for comedic effect, the brilliance of that show is how close it hits to home. For those who don’t know what the debate is about, developers can indent…
Multi-tasking doesn’t exist. All the science tells us that we are only capable of task switching. And task switching is really bad for us. Every time we switch tasks, we add to our cognitive load making us less effective at all the tasks we are attempting to do at once. A lot has been written on this topic with the attempt to justify creating work environments where people can focus.
Passwords play a big role in protecting our data. Either a service provides a way to login with a password, or they provide a way to login with another service like email, Google, or Twitter and those services use passwords. Passwords are unavoidable and important. That means the passwords themselves need to be secure. Many services have password rules to ensure that people create secure…
Software development is notoriously difficult to estimate. For this reason, I know few people who take the Waterfall process seriously. There are many factors that create a level of unpredictability. One is that there are usually pieces that need to be built that a developer has never built before. The lack of domain experience will result in something being missed and all the planning in the…
Hiring software developers is a difficult endeavor. Good developers are hard to source and they’re hard to interview. I have zero advice on the former, but plenty of experience with the latter. When I first started interviewing developers, I had no idea where to start. The only advice I received was “Try to determine if you would like to work with the person.” How do I find out if I would like to…
I recently heard of a situation where a team needs to hire someone since they’re understaffed. The reaction from one of the developers was simply: “I don’t want to maintain their code.” I understand this mentality. The worst code is always other people’s code. For most developers, this is simply fact. What is also fact is that very little software of significance gets built by the lone wolf.…
All software systems will fail. This is unfortunately a fact of life. Not even the biggest companies talk about 100% uptime. They talk about the number of ‘9’s of uptime a system has (e.g. 3 9s is 99.9% and 5 9s is 99.999%). Being able to claim a large number of 9s is a point of pride. While all software fails, developers can show off their skills by claiming to have a large number of 9s.
Software development is hard. Bugs and inaccurate time estimates are a fact of life. Software is too complex these days for things to go exactly as we’d like. However, developers often add to the difficulty of software development by doing certain things that make it harder than necessary. I know I have. One of these tendencies is associating less typing with saving time. It sounds logical…
I often say that one of my favorite quotes is: “There are developers with 30 years of experience and there are developers with 1 year of experience repeated 30 times.” This was said by a professor of mine who had 30 years of experience. It’s an important thought because some developers may have a lot of experience on paper, but they aren’t actually very good developers. They stopped learning…
Regardless of what project management software you use, be it JIRA, Asana, Trello, or whatnot, one thing is true for all of them: adding new tasks is really easy. Finishing things requires actually doing the work or coming up with an extremely compelling reason to delete a task. The notion of tasks being easy to create and hard to remove will naturally result in many tasks piling up. There are…