In the past two years, I have had the good fortune of working under a manager who is self-motivated, has excellent people skills and generally maintains a positive attitude even under tremendously stressful circumstances. In addition, I also had teammates who willingly go beyond their official duties to help me learn and grow as a software developer. This fortunate circumstance has allowed me to learn several things and I hope that I would not forget these lessons.
If something can be automated, it should be.
There is no reason to waste manpower to perform tasks that can be automated. If thousands of lines of metadata can be generated using a perl script, why spend two or three working days (or in my case, 16-hour-work-days) writing the metadata by hand?
If the testing of a product can be automated, spend time writing the code to automate it because the tests will be standardized, can be run multiple times to test for consistency, with different loads to test for load-handling, and for an extended period of time (e.g. overnight) to test for relatively long-term UI interaction.
This applies to any set of tasks that require repetitive, mind-numbing work. My brainpower can be saved for focusing on testing for special-cases, catching errors, and coming up with improved implementations. Even if writing code to automate the tasks does not save a large amount of time (particularly if it means that I had to learn a new language/programming platform), it is often more fun and interesting as well as less soul-crushing.
I found that this habit has helped me in the non-programming aspects of my life as well. Questions for my future self: Can this task can be automated?
When solving a problem, first determine what the actual goals are (i.e. keep your eye on the prize)
When my manager gave me tasks, my brain goes straight to figuring out how to implement them. Because I knew the product down to its nitty-gritty details I would see immediately the complications that could arise and then I would start thinking about how to handle those complications.
This is when my manager would help me step back and look at the larger picture. Sometimes, he would identify a criterion that my intended implementation would not have been able to fulfill.
A lot of times, he would also point out that I have created self-imposed limitations. For example, for the initial stages of an implementation, I do not have to design an intuitive user-interface – I only have to ensure that all the data that my program collect and synthesize is accurate and complete. This would have removed a constraint and let me focus on other parts of the implementation.
Under time constraint, perhaps we would not be able to come up with an exhaustive list of parameters/constraints. Perhaps the best thing to do is figure out how to implement something, fix the bugs that arise and drop features that cannot be completed in time.
But personally, I think it is beneficial, when confronted with a task or problem, to analyze what goals can be dropped and what goals we absolutely have to achieve. This makes it easier to rank solutions and ultimately select the solution that would yield the most optimum result.
Take charge of your learning experience
When my co-worker first came into the group, he scheduled a daily one-to-one meeting with each member of the group so that he could familiarize himself with our product. This was very refreshing to me because I always thought that the new person in any group would often have to adjust himself to the culture within that group. It never occurred to me that you could create your own learning habits/culture and import it into any group that you join.
Given that we all have our unique ways of learning and thinking, recognizing that we have the freedom to infect others with positive changes and attitudes would help ease our way into a new working environment. Keeping habits that we know would work for us would also improve our productivity and efficiency.
Help your co-workers
I do not know if this is true in other work groups. But my team mates have, on several occasions, spent extra hours at work to help me fix bugs that I could not fix on my own. These are after-hours work that do not have high visibility (i.e. upper management may or may not have noticed). The fact that they would go the extra mile to help me even when they may not get any credit for it makes me more committed to the team. This means that when they have a lot on their plate, I would volunteer to take on some of their projects.
Spending time to help your co-workers adds a human touch to the work environment. This attitude generally makes teams more productive.
Have a work-life balance
If you are working for anyone besides yourself, chances are you have to give up certain aspects of your autonomy at work. This is important in order to avoid complete anarchy at work and to ensure that businesses grow in the direction that would benefit its investors and workers as a whole.
If you do not have a life outside of work, this means that you would be spending your day-to-day existence without complete autonomy. Studies have shown that a complete lack of control contributes to higher amount of stress. This leads to a reduction in productivity and greatly reduces self-motivation.
So take control of your life outside of work. Do things that excite you. Spend time building yourself. The experiential learning would help you exercise control over your job/your duties. Of course you would have to follow the general guidelines/constraints set by your employer/clients/business partners. But you would be more accustomed to taking ownership of the tasks and draw on your own creativity and skills to complete them.