Continuous improvement. This post's purpose is to help students and professionals in the software industry get better at what they do by continuously improving. I share points that helped me mature as a person in the last few years and that, in my humble opinion, made my software developer mind-set much better than when I started. What I show here is not going to make you a great developer, but helps you have ideas on making a plan to become one. A great deal of content here is applicable for other areas.
Organization and Time Management
In life, we can only do so many things. However, it is easy to lie to oneself by being lazy or just leaving everything a mess where you can not find anything. Time Management comes to play here. In particular, I recommend you look into the following items:
- Getting Things Done (GTD)
A time management method that can be implemented with several tools; it is awesome because it can help you not forget things that you need to do while allowing you to concentrate on one thing at time.
Focus on the process, not on the end result; that summary might sound a little weird, but the technique is wonderful; you may think that a boring task is too long and you can not finish it, but if you say "I am going to work on it, while focused, for 25min, and then take a break" you are more likely to do something. You focus on the process of spending you attention on something, while removing otherworldly distractions.
These are extremely underrated; creating a checklist is basically creating a small plan. You need to code a piece of software? What are the steps? You may need to learn a concept or do some research and so on. This becomes part of the checklist. By creating small steps and marking them completed as you go, you don't lose track of the full picture, and at the same time you can focus on each item, which is way simpler.
Planning what you will do a day before helps you have more motivation to do the things you plan. Your brain will work subconsciously to help you succeed in your tasks. You can search for more tips about that online. One recommendation is the article "How To Plan Your Day For Maximum Productivity" by Liz Huber.
the four quadrants of time management is an interesting concept to make use of. This article by Alex Czarto gives a nice introduction to it.
Exercise has a direct impact on several areas of your life:
helps alleviate stress and depression,
helps you gain strength and/or lose fat,
helps you brain be healthy, and
can even get you addicted by dopamine releases.
It helps you be more confident in yourself and has plenty of positive benefits. Of course it will take some of your time and it can hurt you if you don't learn proper technique (or if you do a dangerous sport). Strength training is usually quite safe and my choice for life. I heartily recommend it.
In particular, I recommend these:
Calisthenics: for beginners, the recommended routine at reddit is awesome
Barbell Training: Starting Strength book by Mark Rippetoe
Bigger Leaner Stronger: book by Mike Matthews; it also talks about nutrition
I recommend not forgetting about flexibility, independently of the program you choose. It helps you get full range of motion for exercises, so that you can reap full benefits.
Also, depending on how hard you train (and other factors) you may feel pain that needs some massaging. For that I recommend the book "The Trigger Point Therapy Workbook" by Clair Davies and Amber Davies. The book has a nice introduction on why you would need it, which I highly recommend reading.
Even if you can code very well, you may not get that job, or you may even lose your current one. Besides the usual financial reasons companies have to lay off people, the most likely to happen after that is that you are either incompetent or looks like one. Lack of soft skills make you look incompetent.
An example: consider you got a problem and the deadline is Friday. You finished it on time, but haven't pushed your changes to Git, and haven't given status updates of what you had done. A few days pass and your manager and the client think you haven't done it, as they have no clue where the code is nor any written record with status. Your tech skills solved the problems, but it doesn't add value unless you communicate it.
Communication is a very important skill for managing anxiety. Learn it to perfection. There are also other soft skills and you should look them up. John Sonmez has a highly rated book named "Soft Skills". I haven't read it yet, but it seems like a good start.
A specific skill under "communication" is business writing. Once you learn it, you start to appreciate more how valuable the time of your reader is and how to write effectively. The coursera course of Business Writing by Dr. Quentin McAndrew was an eye opener for me. Your boss and your clients will thank your for saving their time by communicating effectively.
Do Not Neglect the Basics
Do not be content at simply finding a solution that works. Try to understand the basics to make sure your solution is good.
I will give an example: consider you get a task to write a C++ class that instantiates some objects and that has a destructor. You have nothing written in such destructor and then your peer gently reminds you that it should free the memory of the initially instantiated objects. You read this and then "free memory"? What the hell is that? You google it and find a piece of code. You copy and paste it to your destructor, but it fails, complaining the object was already freed. To solve it you again look it up and you find out you can allocate memory before freeing. You allocate the object in the destructor before freeing it again and then it works.
There are quite some issues with the above, which is a situation I faced while reviewing someone's code. The basic problem is trying to know the minimum and not looking for the fundamentals before actually solving the problem. My recommendation is to look for the name of the "daemons", the name of the things you need to tackle. If you don't know the name, how to search? A few of the names you may know, but others you may need to find. In the case above, the programmer could have a read a chapter about pointers, classes, searched for the purpose of destructors more and reflected on what they were doing: "I need to free in the destructor, then why am I allocating it to fix the problem? This does not sound right".
In the end: find the names of the daemons, then study them. You can usually find great books on Amazon. For instance: if your problem is C++, you can likely find the best books on C++ by searching on Amazon and looking for the ones with best reviews. Goodreads is another alternative, as there are several book reviews there.
Open Source CS Curriculum
If you do not know where to start to learn CS, I highly recommend looking at the open source curriculum for CS on GitHub. You can probably find the names of several unknowns there and then prepare a plan for tackling it.
Planning helps you get from point A to point B. When you don't plan, you lose the opportunity of taking control of your destiny. I recommend John Sonmez' book "The Complete Software Developer's Career Guide", as it will help you think about your career and plan it. Another interesting book for career development is "So Good They Can't Ignore You" by Cal Newport.
When planning, make your goals as SMART as possible. Just saying "I want to learn programming language X" is too broad. Making this a SMART goal is an exercise for you.
As a final touch: focus. When you start doing too many things, you may not become good at any. Make sure to remove what is non-essential for your final goals. It is not just about doing less of non-important things, but really cutting down as many of them as possible. I recommend the book "Focus: The Hidden Driver of Excellence" by Daniel Goleman.
Do not start coding like there is not tomorrow. You need to look at each problem objectively and plan how to make a good solution. Starting with a "just works" solution without tests and bad variables names is ok, but you should not consider your work done at that stage.
If you save time in an early stage of software construction and leave testing and refactoring to the end, the cost of changing the code will be way higher when compared to doing it right away. Save your time, that of your peers and also your employer's money by doing the whole job.
Maybe the point above is hard to appreciate for you. It was for me at least. What made me realize I had a problem was when a peer was assigned to add a new module to a codebase I wrote most of. A week passed and he simply could not do it. Even though I could and it made perfect sense in my mind, my code was not maintainable, which was frustrating.
Maybe you will think: this will increase my value at the company, as I can get work done fast and no one else can edit it. You have the wrong thought there. This is a way of having diminished value at a company. If instead you work so efficiently and write maintainable code so that your work can be done by anyone else and even new team members can pick it up easily after seeing your code and documentation, you are doing a great job and your value is way higher.
There are some books that may help you appreciate the concept more:
"The Pragmatic Programmer" by David Thomas and Andrew Hunt
"Clean Code: A Handbook of Agile Software Craftsmanship" by Robert C. Martin
"Code Complete" by Steve McConnell
Disclaimer: I'm a man. I'm writing this section on masculinity because it influenced my overall level of satisfaction with myself and this influences my work as well. If you have recommendations on equivalent points for women, feel free to leave some in the comments.
Becoming a man is not obvious. Learn how to be one and then start acting like one. I have read the following books and I highly recommend them:
The Rational Male, by Rollo Tomassi
Iron John: A Book About Men, by Robert Bly
King, Warrior, Magician, Lover: Rediscovering the Archetypes of the Mature Masculine, by Robert Moore and Douglas Gillette.
Even if you aren't a male, you may find interesting to read such books.
Audiobooks and Podcasts
Try to make as much use of your dead time as possible. By dead time I mean that time you usually do the dishes, commute, walk and so on. You can learn during that time and audiobooks and podcasts may be great allies here.
use your favorite search engine
Text editor mastery
Emacs, Vim, Visual Studio Code, Xcode, … whatever text editor you use, please look at the damn manual and learn how to use it. Many souls starting their career or still at school just open the text editor and… type mindlessly. They are not as productive as they can be. Some questions to indicate if you know your text editor besides just typing in it:
Do you know snippets? Multiple cursors?
Do you know all shortcuts in your text editor?
If you use vim: did you follow vimtutor or equivalent?
Git is a very complex tool. You should learn the fundamentals of it and also more advanced stuff. I got some links with reading recommendations for you:
Pro Git book, by Scott Chacon and Ben Straub
If somehow you don't use git, just find an equivalent for your source control system of choice.
There are techniques to learn effectively. Knowing that, find them out and make sure you are being as effective with your time as possible. If you want to learn better/faster, you will really like this advice. Some recommendations:
Compare yourself with the you of yesterday, not others. Comparing you to others might lead to anxiety, so do not think too much of it. However, others can inspire you to become better, so being in an environment with great people or at least reading content they make and using this for your benefit is great.
Journaling can help you analyze how your progress is. There are different types and I haven't settled on one yet. My current setup is inspired by the youtube video "How Do I Journal for Mental Clarity (very simple)" by Nathaniel Drew and I recommend watching.
I presented several tips about productivity I learned in the previous years and also some realizations I had about code, with some references for you to delve more into it. I hope you enjoyed it. I appreciate any constructive feedback, positive and negative, so please don't hesitate at writing comments.