DEV Community

Nikita Sobolev
Nikita Sobolev

Posted on • Updated on

I am a mediocre developer

I personally know some developers who are very talented and can create wonderful pieces of software with no or little struggle. Because of these gifted individuals, our industry is full of high expectations. But the sad truth is: not everyone is a ninja/guru/rockstar developer.

And that's exactly who I am: a mediocre developer. This article will guide you through surviving in the industry if you are not a genius.

I google the simplest things all of the time

I fail to remember a lot of the things. Like functions and methods from the standard library, arguments positions, package names, boilerplate code and so on.

So, I have to google it. And I do it on a daily basis. I also reuse code from old projects. Sometimes I even copy-paste answers from StackOverflow or Github. Yes, it is actually a thing: StackOverflow Driven Development.

But I am not alone. A lot of other developers do it too. There's a popular twitter discussion which was started by the creator of Ruby on Rails.

But why is that bad in the first place? Well, there are several disadvantages about it:

  1. It allows you to copy bad design decisions or vulnerable code from other people
  2. It forms a specific mindset: if we can not google something up, then "Houston, we have a problem"
  3. When the internet will go down, we won't be able to work

But, I don't think that it is a big problem. It even may serve as your secret weapon. I have some pieces of advice to follow to decrease negative effects.

How to survive:

  1. Use IDE to get autocompletion and suggestions, so you won't have to google the language basics
  2. Remember where (not how) you have already solved this problem. So you can always look there for the solution
  3. All code you paste into the project should be analyzed, refactored, and reviewed later. This way we won't harm the project with the bad code, but help it with the fast solution

I keep things straight simple

Machines always do what they are told. Sometimes they are just told to do the wrong thing. So, the main problem in software development is not machines, but developers' mental capacity. It is very limited. So, we - mediocre developers - cannot waste it to create complex abstractions, obscure algorithms, or unreadable long code blocks. Just keep it simple.

But how can we tell that this code is simple and that one is complex? We need to use WTFs/Minute method to measure code quality.

wtf/minute code quality

The principle is very easy and clear to understand. Whenever you find something in the code you do not understand - it is too complex. What can you do?

  1. Rewrite it to have cleanner design
  2. Provide documentation
  3. Add comments to the most tricky parts. But remember, that comments are the code smell themselves

How to write simple things from the beginning:

  1. Use correct names for variables, functions, and classes
  2. Make sure that every part of your program does only one thing
  3. Prefer pure functions over regular functions
  4. Prefer regular functions over classes
  5. Fallback to classes only in a strong need

I do not trust myself

Some developers proved to deliver high-quality code. Like this woman: Margaret Hamilton, lead software engineer of the Apollo Project. In this picture she is standing next to the code she wrote for the moon mission:

Margaret Hamilton

But, whenever I write any code - I do not trust myself. I can screw things up really badly even in the easiest parts of the project. This may include:

  1. Language errors
  2. Logic errors
  3. Design errors
  4. Style errors
  5. Security errors
  6. WTF errors (my all-time favorite!)

And there is no magic book about "learn how to write bug-free code". And it is perfectly normal. All software has bugs. Except this framework though. Deal with it.

The thing is: anyone should not be allowed to write code with obvious errors. At least, we should try. But how can I protect the project from myself? There are multiple ways to do it.

How to survive:

  1. Write tests. Write a lot of tests. Starting from integration tests down to unit tests. Run it in the CI before each pull request. This will protect you from some logical errors
  2. Use static typing or optional static typing. For example, we use mypy with python and flow with javascript. Positive effects: cleaner design and "compile time" checks
  3. Use automated style checks. There are tons of the style checkers for every language
  4. Use quality checks. Some tools run some complex heuristic algorithms on your code base to detect different problems like this line has too many logics inside, this class is not needed, this function is too complex
  5. Review your code. Review it before merging to master. And sometime after the merge
  6. Pay other people to audit your code. This technique has a huge positive influence! Because when developers look at your code for the first time it is easier for them to spot inconsistencies and bad design decisions

It should work not only on my computer

Works on my machine

When my team has developed our first big software project almost ten years ago, we have shipped it as java source files. And it failed to compile on the target server. That was several hours before the presentation to the client. This was a big failure! Somehow we have managed to get it up and running, but it was a life-changing experience.

That happened because there was a lot of configuration and a lot of complexity in the build pipeline. And we could not properly manage the complexity of this system. Since that day to reduce the complexity on this step I try to pack my programs in isolated environments. And to test them in this environment before the actual deploy happens.

In the last years with the rise of docker (and containers in general), it became as easy as ever. docker allows you to run development, tests, and production in the same isolated environment. So, you would never miss any important things along the way.

Wound't you? Talking about myself, I always forget something while creating servers, initially configuring them, or linking them together. There are so many things to keep in mind! Hopefully, we can still automate it. There are different awesome tools to automate your deployment process. Such as: terraform, ansible, and packer. Read about them to find which one do you actually need for your tasks.

I also try to set up CI/CD as soon as possible. So I will be reported if my build failed in testing or in deployment.

How to survive:

  1. Automate anything you use for deploy
  2. Use docker for application development, testing, and deploying
  3. Use deployment tools

After the application is deployed, I still do not trust myself

Oh, at last, my application is in production. It is working now. I can have a short nap, nothing is going to break. Wait, no! Everything is going to break. And yes, I mean it: everything.

Actually, there are some tools to make finding and fixing existing problems easier.

  1. Sentry. When an error happens for any of your users - you will be notified. Has bindings to almost any programming language
  2. Different services and tools to collect logs from multiple processes and servers into one place
  3. Server monitoring. That's the place where you can configure monitors for CPUs, disks, networks, and memory. You can even spot the time to scale before the users will actually break your service

To put it shortly, we need to monitor our application in production. We sometimes use all of these tools, sometimes only the most required parts.

Constantly learning

Wow, that's a lot of things to learn. But that's how it works. If we want to write good software we need to constantly learn how to do it. There are no short ways or magical tricks. Just learn how to be better every single day.

In conclusion, we need to understand two basic things:

  1. Problems happen to everyone. The only thing that matters is how ready we are for these problems
  2. We can reduce the sources of the problems to some acceptable rates

And it has nothing to do with your mental capacity or mindset.

Latest comments (79)

Collapse
 
damian_cyrus profile image
Damian Cyrus

I will add this to the daily list of our junior developers to read it. Every. Single. Day.

And me, too. This is such a great motivation every morning.

Thank you from the bottom of my ♥️.

Collapse
 
biffbaff64 profile image
Richard Ikin

I love that you included my personal software heroine, Margaret Hamilton.

Collapse
 
epsi profile image
E.R. Nurwijayadi

Nice article.

Collapse
 
devillers profile image
Martin Devillers • Edited

I feel like that there are three types of developers:

  • Bad developers who write shitty code for whatever reason and are blissfully unaware that they do
  • Good developers who think that they are bad developers because they all suffer from a strong case of Imposter Syndrome
  • Linus Torvalds

Impostor syndrome is a psychological pattern in which one doubts one's accomplishments and has a persistent internalized fear of being exposed as a "fraud". Despite external evidence of their competence, those experiencing this phenomenon remain convinced that they are frauds, and do not deserve all they have achieved. Individuals with impostorism incorrectly attribute their success to luck, or interpret it as a result of deceiving others into thinking they are more intelligent than they perceive themselves to be. While early research focused on the prevalence among high-achieving women, impostor syndrome has been recognized to affect both men and women equally.

Collapse
 
sinewalker profile image
Mike Lockhart • Edited

I have noticed a pattern in web development when integrating web services: there is an unreasonable faith in the data returned by APIs.

Especially if that API was written or managed by the customer. Web Dev's appear to have forgotten about GIGO (Garbage In, Garbage Out)

So I would add to this post: assume the input is broken

XML will be malformed. Check for it.

Do your own maths, don't rely on a calculated sum

Dates will be American instead of ISO. In fact, use a date picker for user input. Type check input on the front end.

Customer data need to be uploaded to your server? Ok then, zero-bytes files are a Thing.

There will be characters that are non-UTF-8.

There are so many ways to fail. Check your input and handle bad data gracefully and loudly. Don't assume your input will never be bad

Collapse
 
hatari_hanzo profile image
Jacques de Villiers

Love this, thank you.

Collapse
 
jeddevs profile image
Theo

Amazing post, so true to life.
I indeed feel like this is a problem and have luckily found some great mentors on some amazing discord servers.

Collapse
 
kaelscion profile image
kaelscion

This is a really great post and, honestly, I'm reading it right now because of how discouraged I am with my development career.

I am currently at the point where I wonder if I should just throw in the towel and go get a house-cleaning job because I can't even seem to give my services away at this point. And I find myself actually being one of the developers that don't need to Google things all that often and knows the standard library of my language of choice (Python) very well, and still nothing.

The last several months have been rejection after rejection, both as a freelancer and in the 9-5 world. So, I would offer the encouragement that, even if you feel that you are "mediocre", at least you're employable. Some of us, for one reason or another, simply aren't.

I love to code so much. I swear I would do it if I picked up garbage for a living (and to be totally honest, that looks like where I'm headed). So keep going with that love and never remember: no matter how you feel about yourself or your skill level, you are still miles ahead of those of us who are unemployed!

Collapse
 
sobolevn profile image
Nikita Sobolev

Keep going! Rays of support coming from me to you!

You can actually join some open-source development in Python. I have a bunch of projects. That's the world where people appreciate your work and effort, provide mentorship, advice, and help. With more experience it will be easier for you to find the dream job.

Some projects that I can offer:

Just drop me a line if you are interested: mail@sobolevn.me

Collapse
 
edwinthinks profile image
Edwin Mak • Edited

I love this post! I know the reasoning for labeling yourself as a "mediocre" developer. But to be honest, this is much more mature than most self-proclaimed "genius" developers.

The beautiful thing about "mediocre" developers is that it is repeatable and teachable. These things laid out here is something that can be practiced and honed. I believe a company does better hiring 50 "mediocre" developers than 50 "genius" developers.

Great read! Absolutely gained a new follower :)

Collapse
 
m1guelpf profile image
Miguel Piedrafita

@sobolevn Generated an audio version of this using Blogcast!

If you want to add this 👆 player to your article, just add the following code at the start:

{% blogcast 325 %}
Collapse
 
sobolevn profile image
Nikita Sobolev

Thanks, btw your domain is blocked in Russia: isitblockedinrussia.com/?host=http...

Collapse
 
Sloan, the sloth mascot
Comment deleted
Collapse
 
sobolevn profile image
Nikita Sobolev

Thanks for your story.

I think that you have touched a very important problem, that was not covered in my original post.
It is all about broken interviews. For what reason should developers crack these HackerRank questions in just 5 minutes? Is that what they are going to do during their work days?

If so, please do not sign me in. I want to solve more complex problems. Which include communication, long term planning, architecture decisions, prototyping, finding and inventing new tools for the job, etc. And I have mentioned just some skills that are mostly not covered during the interviews but are essential for software developers.

All in all, I hope that you will find your perfect job!

Collapse
 
giorgosk profile image
Giorgos Kontopoulos 👀

@sobolevn great post. Kind of late reading but very inspiring. I can also be seen as a midiocre developer.

I am also looking up the most trivial things about a language or concept because I want to make sure I remember them correctly or because I don't have the capacity to remember them all.

Heck I was recently asked on an interview to describe programming concepts that I half knew or did not know at all and it felt embarrassing for a brief period after the interview since I have been doing web development for more than 15 years.

Later on I came to the realization that its OK to not remember all those concepts. I personally would not call you or me or anyone on similar boat midiocre developer.

With all the different areas of development to be explored the last few years its not possible to know or remember them all by heart. Each one of us gets accustomed mostly to the ones that are often or recently used. The strong point of a developer should be that given a problem to find a good, practical solution that stays within time limit and budget.

Collapse
 
jaakidup profile image
Jaaki

Beginner programmers write simple code.

Mid Level programmers write complicated code, abstracting an abstraction of an abstraction, mostly trying to be clever.

Senior programmers write simple code.
Having seen the light, senior programmers know that humans are flawed, keeping things as simple as possible is more valuable than bragging about your latest "hello world" that took only 173 lines of code.

BTW. Googling simple function names etc. only means that you don't waste memory capacity, rather saving it for higher level thoughts. Especially these days when most of us have to learn so many different languages and tools inside each project.

Nice Post!

Collapse
 
suedeyloh profile image
Sue Loh

One of my personal best practices to protect against my own overconfidence: For every PR I write up the comments to include the testing I did. And I write down all the testing I should do. Sometimes I discover testing I didn't actually do, so I go back and do it. And more than once, I found bugs when I did!

Collapse
 
titonton profile image
Assame Dessables

I feel like my biggest problem is figuring out exactly how to write tests and stuff. I do mobile development and hot reloading has been my savior for the most part. If not then I just compile and run on each platform every time I make a change. Definitely a time waster. Great post!