Based on the highly acclaimed book The Passionate Programmer by Chad Fowler, I decided to compile a list of actions which might help others to find the passion in software engineering and ultimately might strengthen their career. This list is loosely based on the "Act On It!" paragraphs at the end of each chapter in the book and I strongly recommend reading it. After each point, you should of course reflect your current career path and how you could improve it, to bring more enjoyment in your life.
Part II: Investing In Your Product
Part IV: Marketing Not Just For Suits
Map - from left to right - emerging, standard and dying technologies on a sheet of paper. Mark the technologies you are strong with, the ones you have basic knowledge of and finally the ones you have a special interest in, each in a different color.
Do your skills and interests cluster?
Search for job advertisements in your particular field of expertise and note down the most common requirements they share. I tend to do this every three months regardless of my employment status since it will help to see where you stand on the demand and supply ladder. Afterwards, rate your knowledge in these fields from 1 to 10.
Do you need to freshen up your skillset?
While it would be quality time to spend lunch with a business person, most of us will not have this chance. Therefore, I suggest finding a magazine or website that covers your trade. Reading it on a daily basis, will help you a lot to understand the needs and even the emerging issues in your industry and ultimately in your company. I subscribe to iX, read Java Aktuell, Java Spektrum and Heise for example.
Start working on a project where you are not the go-to person but can actually learn from others. Open source projects not only provide a safe environment to be overwhelmed but also allow you to gain experience for your future by failing. You can find interesting projects just by searching for one in your field of expertise with a search engine or use GitHub, SourceForge or Bitbucket.
After you have found an interesting project, you just look at their issue tracker. The first thing I do, is to look how many issues have been created, how they are classified and if the developers create regular fixes. Start with the trivial issues and work yourself up to the blockers. You could also write one of the core developers and ask if you can help on a specific task, even it is localization or documentation.
Another approach is to attend regional user groups for a technology you are interested in. In Germany we have a lot of different organizations, e.g. the Java User Groups or the Linux User Groups. These meetings are often organized and attended by seasoned developers which might shape your future.
It is reasonable to learn a new programming language but you should either choose a language which is in high demand and you did not mark in Supply And Demand or you should choose a language which is unlike anything you ever did.
For me it would be JavaScript and Haskell. JavaScript is very different since it is functional in nature and has prototyping. It is incredibly hard to use good and incredibly easy to use badly. It is also the most established language in frontend web development and emerging in the backend section.
Haskell has a great community and is like a playground for challenging concepts which are beyond anything any programming language has ever dared to even think of.
If you don't know Python, you could learn it in a few days since it has neat tutorials. It is also becoming the standard language in scientific computing, especially in data analysis.
Write down your last career choices and try to find the underlying motivation for your decision.
Were they driven by emotions, instinct or reason?
Would you choose differently now?
Be generally useful, don't be Just-A-x where x is for example Java-Developer or Tester.
So how do become a generalist? You already should be. If you are easily interested in things, you just want to learn. There are several dimensions in which you can improve your general knowledge, e.g. operating systems, natural as well as programming languages or general eduction. It doesn't matter just become curious!
If your current job is focused on a single technology, you should try to become a true specialist by understanding the fundamentals. No matter which frameworks will come and go, you will always have a deep understanding of their foundations and a much easier time to understand their benefits for productivity. If you are a Java EE developer, learn about the intrinsics of the JVM.
If possible, try to help people with your knowledge. The best way to learn is to teach. If this is not possible in your job, e.g. with students, interns or new colleagues, you can always offer to hold a presentation about an interesting technology - either at a conference, local meeting or in your company, even if it is just an informal brown bag session.
Try to program a game in your most productive language. Why a game you ask? Because it requires the most fundamental and also broadest knowledge.
Conway's Game Of Life is an excellent choice and you could always add some professional flavor by using Test-Driven-Development or new tools, e.g. for Continuous Integration. Afterwards, do the same in the language you choose in Invest In Your Intelligence.
Some jobs are inherently bad for you and can't be changed from within. However, there are personal or economic situations where a job change might not be possible and you should always have an emergency fund for at least six months. If you are ready for change, I compiled a list of questions to ask in an interview.
A bad job does not only harm your career in the long run by impeding your professional development, but can also ruin your mood which in turn will have effects on your private life and health. I strongly recommend to read The Clean Coder by Robert C. Martin, it will change the way you define professionalism in software engineering. It will also answer the question how you actually know that your job is bad and when you should leave the sinking ship.
Another way is to create an excitement log. For every workday in the next two weeks, rate your level of excitement from 1 to 10.
Do you see peaks and what are their reasons? What is your average excitement? What can you do to increase your excitement level next week?
Try to actively raise your excitement as much as possible. If you cannot change the levels no matter how hard you try, you should talk to your superior if possible or think about a way to change your current assignment or even the job.
Do you use a specific technology on a daily basis which you don't really know about? Learn how to use it and understand it. Pick an often neglected tool, e.g. the version control system, and learn the intrinsics. Become the go-to-person for this tool.
Why is it particular useful for your current project and are there alternatives?
Reading a dedicated business book might help to understand the decisions of your company and also might help you to evaluate your own position and possibilities. I recommend either The Personal MBA or The Ten-Day MBA. Try to talk about it with your managers or superiors and apply it to your current situation.
Did you ever encounter a person in your line of work that you admired?
Write down the attributes and characteristics of this person and rate their importance from 1 to 10. Afterwards, rate your own expertise in these abilities and subtract your rating from the importance rating. You will be left with a priority list, e.g. you admire the technological breadth of your role model and find it quite important so you assigned an 8. You think that you are not as versed in different technical disciplines and rate yourself at a 4. Basically, this sets you up with a below-medium priority of 4 for strengthening your knowledge in other technologies. You can then come up with a list of ideas to improve these abilities and try to emulate your role model.
Also, you should always try to stick around these people, as they will help you to develop and you will generally have a good time.
Try to help people. Whether it is a new colleague or an unknown person in an online forum. Just keep an eye open and you will always find someone asking for help. It is an art to offer help without appearing to be condescending.
Some people like to do code kata and others use Code Chef or something similar. I wholeheartedly recommend Project Euler. It may be too much for you right now and I think that you can get enough practice by volunteering in open source projects and generally helping others. But you should always diversify your practice projects, i.e. if you work on a web application, you should try some game development.
Pick a software methodology and learn about it. I like agile methods, but you should never become a zealot and question their usefulness and implementation.
Why and when is this particular methodology useful? Could your daily work profit from it?
Pick a project, maybe an open source project that you like to work on, and read it from top to bottom. Make notes about the good and the bad things. Try to understand the decisions and thoughts behind in critical code block.
Pick a menial task you do often and automate it.
The Passionate Programmer suggests that you take a look at model-driven architecture.
We all have half-finished projects and things we always wanted to do - like writing a blog. Pick one and work out a schedule for completion and then work on it with a determination to finish it as soon and as good as possible. Don't try to be perfect, just give it your best and be sure to finish even it is a first draft.
Try to come up with a few features for your current or next project which have not yet been discussed and which you think will become relevant. Try to think about the implementation costs and maybe even prototype it.
Write down the little annoyances which you are facing daily and start solving them one each day starting tomorrow.
Talk to your manager and ask him about the team's goals.
What are the immediate goals you need to achieve this week?
What are the long-range goals?
Prioritize your tasks accordingly.
Recapitulate and ask yourself what you did accomplish in your current job.
What do you want to accomplish from here on and how long will it take?
Work actively to "complete your job".
Some tasks we do are boring and after a few years they rob us of our motivation. Maybe you can bring back motivation by creating a competition. You could compete with your colleagues or with yourself. Find metrics like unit tests and try to increase your performance and maybe give yourself a little price at the end.
Think about your current salary and double it, this is roughly how much you cost the company.
Are you currently worth the investment?
Make your team less dependent on you whether it be the code or documentation. Make documents easily accessible in a way that if you left tomorrow, your team could continue.
If you maintain software and/or work with legacy code, create quality measurements like the number of unhandled exceptions, responsiveness times or the usability. Improve these factors and measure again. Can you actually improve the old system without breaking it?
Set an exact time to start and finish your eight hour work day. Plan as much as possible, beginning with the breakfast, lunch time and ending with your commute home. Work in these eight hours, no reading news, just work until you are done. Then go home and do not take work home with you, no e-mails, nothing!
If an issue occurs, you should behave according to these four steps:
Do not make commitments you can't keep. Either just say "no" or provide a good estimate. As soon as an issue arises that endangers your commitment, you should inform every participant.
Keep a list of every commitment you make:
Evaluate your hit rate.
If you care about your job, it is inevitable that you will panic at times. Keep note of these situations and record why you panicked. At the end of the week, you should review your records and think about how it went and if the emotional stress was really worth it.
Create a plan for the next day containing items you want to do. You will sometimes overcommit and not finish your list but you just can transfer the undone items to the next day. After you completed a week, you should communicate your task list to your superior.
Make a list of the groups of people in your office and what they perceive as important, e.g.:
Teammates - programming skills, social skills Secretaries - social skills
How do you interact with the members of these groups, do they perceive you in a good way or do you need to adjust your interactions with them?
Take a look at your conversations with people that are not as well versed in the technical aspects as you are and ask yourself what they might have perceived. Did you get arrogant or aggressive? Did you make your position clear in a manner they could understand? Think about what it would be like in a position where you are not the expert and need help from specialists.
You should always keep your writing clean and concise. Clean means that you check for spelling and grammatical errors. Due to the nature of our work, many things are done by e-mail which increases the status of writing and becomes as important as your general attire in a face-to-face conversation.
Maybe start writing a diary or a blog. Reading literature also improves your language skills and is a good way to disconnect from work and especially technology. The top 200 most popular books of Reddit is a good place to start.
Make yourself known by showing presence. Don't write an e-mail but phone the person or visit him in his office. Try to make human connections with your coworkers by doing smalltalk. The most important place is often next to the coffee machine.
What did you accomplish and what was its business value? What do you currently work and what is the benefit?
Do you know someone who has a mission at your office, maybe someone who is a defender of agile methods or particular engaged in a local user group? How do they behave and when do they misstep?
By now you should know a lot of technologies and methodologies. If there is one among them which you think might improve your business, you should make it your mission to advertise for it.
Create a weblog and write articles. Focus on a specific range of topics that are connected.
If you accumulated a list of articles, you should contact relevant magazines and offer to write for them.
Google yourself and look at the first page results. Do you appear? If you do, are the appearances positive?
By now you should be involved in an open source project. You should use a code coverage analyzer and find the parts of the code that are not unit tested. Are they testable? If yes, refactor - else write unit tests and commit the patch.
Do something remarkable on your current project. Maybe you can implement a feature as suggested in Mind Reader or you could finish a task much earlier - even it means extra hours.
Get in contact with the creator of an important piece of software, thank him and maybe offer him some help. You could write an article in your blog about the software which will make introductions easier.
What are the latest technologies and trends? Research them, get a grip of them and do some tutorials. It could be a languages like Rust, Dart or Julia, technologies or concepts - just go for the bleeding edge.
Do a bit of roleplay and change your job for a day by pretending to be a tester or project manager.
Focus on a menial task like washing dishes. Don't rush it, but experience the moment - be mindful.
Make a map of your career history. Where did you start and which technologies were involved. This should help you to perceive the correct dimensions for further career development.
If you found a bleeding edge technology, try to become an alpha geek and if you have the chance, surround yourself with people that don't stand still.
Get some honest feedback about yourself from colleagues, customers, peers or managers.
Create a questionnaire containing the characteristics which you value as essential to professionalism and let your reviewers rate you. Maybe you can think of additional questions that you could ask?
Evaluate and share the answers with your reviewers.
Review your values which you hold dearly. Are you right to do so or are you just rigid? Did you become an evangelist for a certain kind of technology or methodology?
If you must answer one of these questions with yes, you should let go for some time and experience something new. Pick a technology you hate and do a project in it.
What do you want, really want? Do you want to be a CEO? A project leader or lead developer? Maybe you just want to hop from one start up to the next which is fine too but think about the consequences. Is it money you want? Fame? Or do you want to balance work/life? Are you currently working on the wrong issues to fulfill this ambition?
Make a list of complex improvements. How can you do something today to get closer? Even if it is a tiny step like running a single lap more or writing one unit test more. Do it, today.
Ultimately, you should know what you want. There are three big choices: