After some years working as Software Engineer/Developer, we start noticing that no matter of the role, company, programming language or any other specific detail related to our work.
There is always a common factor and is our method to deal with any kind of problem, technical and non-technical, that defines how effective we are in our work.
We create a method (consciously or unconsciously), a pattern or mental algorithm we apply in our daily tasks. It can vary of course depending on the nature of the problem. But does this method deliver the best results? Is our performance optimal, or maybe we can do better?.
Perhaps for you, as it happened to me, there is some kind of duties in which we have a better performance and others that make us struggle for our, days or even more, without finding a good and fast way to deliver what we've been asked to.
For Software Engineers, the kind of problems we have to work with is mostly technical in nature. Technical problems requires to be completed within the metrics of time and quality.
Of course, our performance (focused on technical tasks) and effectiveness (focused on teamwork) will depend on our experience level. A junior developer has different skills and experience than a senior developer. Nevertheless, for every experience level, there is always room for improvement. For junior devs, it might be defining the goals of increasing production capacity by learning the advanced concepts required for higher responsibility roles, which is done by taking courses or certifications and gradually getting more challenging projects. For an advanced developer, it might learning how to be an effective leader and helping new developers, or taking full responsibility for the architecture of a new project.
In this article, we're going to make a review of good practices, techniques and mental paradigms that can help us to increase our performance in the short term, for specific and objective based tasks. But we'll also learn how to be effective Software Developers in the long terms by staying focus in the things that matter and tracing a roadmap for our goals.
I'll borrow this concept of P/PC balance from Stephen Covey's book The 7 Habits of Highly Effective People (I personally recommend this book for anyone, not just developers or professionals, it contains knowledge for life): Production vs Production Capacity. Many times, developers focus almost exclusively on production, so much that easily forget to improve their production capacity.
On the other hand, we can't afford to focus only on PC and spend most of our time studying and learning about new frameworks and technologies and forget about our tasks and deadlines (the Production), that would make all the effort in learning pointless.
The best way to have a P/PC balance is setting our learning goals in short or mid-term (take a course on X or Y cloud technology or learning a new Z JS framework) and create a schedule where we reserve 3 or 4 hours a week for that purpose. It's an extra mile in our program, but it's worth it as it's going to return the investment.
Career Path & Goals
We talked about the importance of Production and Production Capacity and that we need to set short or mid-term goals to improve Production Capacity. Now let's think in the long term. Software Developers as any other professional follows a career path based on her/his own interests and personal goals.
The first step then is to define a set of goals for the mid or long term, where do you see yourself in the next 5 years, in the next 10 years?. Perhaps you picture yourself as a technical leader, a Project Manager or as an Architect, it depends on what you want.
As engineers we use to think in the structure, the procedure, the "hows" to achieve something, how we administrate resources and get the maximum efficiency in design or task, in other words, we use the rational left hemisphere of the brain. However, when it comes to make a career plan and trace goals, we need to step aside and think with the right hemisphere of the brain, the imagination to see all the possibilities and choose what we really love to do to, what challenges we'd like to embrace to become an even better versions of ourselves.
Productivity increases when we specialize and become really good at doing something. So in the mid/long term, as we think what's the next steps in our careers and pick an area of specialization. This is also important, so we promote ourselves ahead of the competition. But what options we have?. There is a bunch of specialties we can choose from in the next years :
- Front-end: Developing client-side web applications (apps which live in the browser).
- Embedded and Application: Typically developing embedded software, like firmware for network devices and Internet of Things.
skills: Embedded Systems/Software, C, Linux, Testing, Debugging.
- Infrastructure and Cloud Computing: This category includes what traditionally was called back-end development, which has gradually evolved into the cloud.
skills: Databases, Business Intelligence, Data Warehousing, Containers, Cloud & Distributing Systems, Web Servers.
- Machine Learning and Data Science: A specialty related to business domain knowledge, Mathematics/Statistics and Computer Science. Data Scientists create models to help a company make business decisions based on substantial data sets (Big Data).
skills: Machine Learning, Python, Algorithms, Hadoop, Statistics, Data Mining.
- Mobile: Development of mobile applications for Android and iOS, which is done natively or using a third-party framework (i.e., React Native, Ionic, Apache Cordova).
- Test and Quality Assurance: This role is about designing tests and knowing about the development operations and CI/CD tools to integrate quality into the product as a first-class citizen.
skills: QA, Test planning, Test Automation, Regression Testing, Jenkins, Selenium.
Once we have a well-defined set of goals for our career future, it's time to trace a plan, that includes a schedule, resources (e.g., time, money) and a proper series of steps to achieve each goal.
Our plan might include a series of steps or tasks oriented to achieve a specific goal, for example, to get a certification or complete a course on a subject, we need to book a certain amount of hours a week and also save some bucks to afford it.
I would recommend to make a schedule and specify all your tasks and make a balance on your available time. We don't want to put so much work and forget about getting some time off for ourselves, family and friends. We need to put enough time to get the desired results.
An essential part on administrating our time and money resources is setting the right priority to all our activities. We can have the discipline and put so much effort, but if all that work goes to the wrong places, we still won´t get the right results.
How can we identify where we need to make most of the work?. The next diagram (from Stephen Covey's 7 Habits book) shows the relation between urgent and important activities. 
There are four quadrants, for low and high levels of importance and urgency, where we classify the tasks on our plan and daily work.
The quadrant where we have to live is the II: The tasks that are important, but not urgent. If we think about what's critical, we realize that urgency comes from the needs of other people or from the crisis we have to attend.
Of course, we have to attend to other's needs in our work, but there's a line of respect to our time if a project we're working on is getting done right according to plan and schedule, then there shouldn't be urgent needs from any member on a team. Some people get used to working under pressure, where all tasks are critical, but nothing gets really done in time; actually, they have a lot of pending things in a backlog of work. This is not good, it leads to frustration and general unhappiness.
On the other hand, if we spend most of the time on not necessary, not urgent tasks, there's merely no progress, in the end, we'll fail in our duties.
By staying in the things necessary, but not urgent, we prevent future crisis and always keep getting results and benefits over time.
Tracking and Focus methods
Now we have defined our goals and made a list of tasks or steps to achieve each goal. It's time to deal with the performance to do a specific work and how to keep track of all the functions so with don't miss any important one in the way. The key in the short term (the work we do in a day) is then keeping focused on the task, and in the long run (over the several days or weekend(s)) is keeping track of pending and completed tasks.
There is a popular focus method that I've found works very well for programming (as well as with other professional activities): the Pomodoro Technique. It's a time management technique designed to put all your attention on the work you're doing in time batches of 25 minutes (a Pomodoro), separated by short breaks, typically 5 minutes, and a long break every 4 pomodoros.
By putting full attention in a task, you dramatically increase productivity avoiding many of the distractors you may have, like your smartphones, social media, e-mail and others, while you're working in a Pomodoro, but then have a break to check any of the previous before getting back to work.
The Pomodoro technique works better when you classify the tasks we're going to work on. We can make use of Kanban (a Japanese method originally created for manufacturing at Toyota) boards to organize and schedule our work in categories, for example: To do, For today, In Progress and Done, and move from left to right while we're making progress in each task.
I recommend an excellent tool that combines both, the Pomodoro Technique and Kanban boards: KanbanFlow. It's an online app, totally free, you just need to create an account and start enjoying it.
A final piece of advice is to start the work or study day by creating a bunch of tasks to achieve a day goal and organize the jobs, in this way you ensure to keep productive by not stop thinking what's next constantly over the day.
Thank you so much for reading this article. Take care and talk to you again with more Full-Stack development topics. Cheers!.