Julio Biason
6 years ago
1 changed files with 107 additions and 0 deletions
@ -0,0 +1,107 @@
|
||||
+++ |
||||
title = "Thing I Learnt The Hard Way (in 30 Years of Software Development) |
||||
date = 2019-06-10 |
||||
|
||||
[taxonomies] |
||||
tags = ["en-au", "programming", "work"] |
||||
+++ |
||||
|
||||
This is a cynical, clinical collection of things I learnt in 30 years working |
||||
with sofware development. |
||||
|
||||
Again, some things are really cynical, others are long observations on |
||||
different jobs. |
||||
|
||||
<!-- more --> |
||||
|
||||
## Software Development |
||||
|
||||
### Learn to monitor |
||||
|
||||
On a previous life, to understand how a system behaved, I added a ton of |
||||
metrics: how fast things were going in, how fast things were going out, how |
||||
many things were in the middle, how many the job processed... |
||||
|
||||
It gives a really good view of how a system is behaving. Is the speed going |
||||
down? If it is, I can check what is going into the system to understand why. Is |
||||
it normal going down at some point? |
||||
|
||||
Thing is, after this, it is really weird trying to figure out how "healthy" a |
||||
system without any monitoring is after that. Checking a system health with just |
||||
"Is it answering requests" doesn't fly anymore. |
||||
|
||||
Adding monitoring early will help you understand how your system behaves. |
||||
|
||||
### Unit tests are good, integration tests are gooder |
||||
|
||||
On my current job, we do test modules and classes only (for example, we write |
||||
tests for the view layer only). It gives us some idea if things are going right |
||||
or not, but they lack a view of how the whole is going on -- a thing |
||||
integration tests, which tests how the system as a whole behaves -- do better. |
||||
|
||||
### Tests make better APIs |
||||
|
||||
We code in layers: There is the storage layer, which should make our data |
||||
permanent; there is a processing layer, which should do some transformation on |
||||
the data stored; there is a view layer, which has information on how the data |
||||
must be present; and so on. |
||||
|
||||
As I mentioned, integration tests feel better, but testing layers by themselves |
||||
can give you a better view on how their API looks like. Then you can have a |
||||
better look on how to call things: Is the API too complex? Do you have to keep |
||||
to much data around to be able to make a single call? |
||||
|
||||
### Future thinking is future trashing |
||||
|
||||
When developers try to solve a problem, they sometimes try to find a way that |
||||
will solve all the problems, including the ones that may appear in the future. |
||||
|
||||
But here is the thing: The problems from the future will never come and you'll |
||||
end up either having to maintain a huge behemot of code that will never be |
||||
fully used or you'll end up rewriting the whole thing 'cause there is a shitton |
||||
of unused stuff. |
||||
|
||||
Solve the problem you have right now. Then solve the next one. And the next |
||||
one. At one point, you'll realize there is a pattern emerging from those |
||||
solutions and _then_ you'll find your "solve everything". |
||||
|
||||
### Documentation is a love letter to your future self |
||||
|
||||
We all know writing the damn docs for functions and classes and modules is a |
||||
pain in the backside. But realizing what you were thinking when you wrote the |
||||
function will save your butt in the future. |
||||
|
||||
### The function documentation is its contract |
||||
|
||||
When you start the code by writing the documentation, you're actually making a |
||||
contract (probably with your future self): I'm saying this function does _this_ |
||||
and _this_ is what it does. |
||||
|
||||
If later you find out that the code doesn't match the documentation, you have a |
||||
code problem, not a documentation problem. |
||||
|
||||
## On a Team |
||||
|
||||
### Code reviews are not fot style |
||||
|
||||
Take your time on code reviews to point architectural or design problems, not |
||||
code style problems. Nobody really likes the person whose code reviews are only |
||||
"you left blanks in this line" or "missing space before parenthesis" and such. |
||||
|
||||
Now, if you _do_ find architectural or design problems, _then_ you can add your |
||||
code style problems. |
||||
|
||||
### Code formatting tools are ok, but they are no silver bullet |
||||
|
||||
One thing a team may be tempted to do to avoid discussing style in code reviews |
||||
is to use a code formatting tool to auto-format code before commiting. |
||||
|
||||
Now yeah, that kinda solves the problem, but there is one small problem: |
||||
we, humans, are not as flexibile to read code as computers are; what is |
||||
readable by a computer may not be readable by a human. Surely they try to |
||||
create some heristics on what is good for human reading, but that doesn't mean |
||||
it gets right. |
||||
|
||||
If you _do_ use a code formatting tool, use it to find out where it changes the |
||||
code the most; you probably need to simplify that part of the code to avoid it |
||||
messing so much. |
Loading…
Reference in new issue