What it takes to be a Software Engineer
Warning: subjective opinion inside
6 min read
People often wonder (and argue) what is the exact role of a Software Engineer and maybe even more what is the difference in responsibilities between a Software Engineer vs. Software Developer. This is a broadly discussed topic and people often have highly differing opinions.
With this post, I'm not making an attempt to compile a comprehensive list of all materials available on the topic. I'm merely giving my own, entirely subjective view, based on my past experiences.
OK, let's dive right into it...
The core quality of a Software Engineer is that he/she is capable of fulfilling other roles in the product development life cycle, other than just developing code.
Here is my compilation of the additional roles:
Requirements and Planning
Participates in creating or refining requirements.
Meets with the Product Owner and helps him/her understand technical aspects of the developed solution.
Helps with creating both LOE and detailed estimates.
Software Design and Architecture
Creates models, diagrams and if necessary, defines APIs.
Has a good overview of available technologies and design principles, in order to be able to come up with technology proposals which are best suited for each part of the developed product.
Does research on various types and levels of tasks, starting with simple development impediments (solvable by a stack overflow search), ending with a thorough analysis of a technology, API or library to be used for a new product or feature.
A software engineer's knowledge is not limited by one application "tier" (client, server, database), programming language or technology stack. The grasp should be broad, giving him or her the ability to tackle or at least understand all the tasks and challenges which may arise during the application development lifecycle.
Debugging and Troubleshooting
Understands how to use different debugging, profiling and troubleshooting tools and techniques.
Maintains development and testing environments (e.g. SQL Server instances).
Troubleshoots performance of queries and stored procedures.
Understands database schemas, knowing how to generate database change scripts and scripts for shuffling data around.
Sets up and manages builds and deployments.
Sets up and manages development, test and staging environments.
Recognizes the benefits of continuous delivery and knows how to implement it.
QA and Testing
Helps QA with spotting and identifying bugs.
Writes bug descriptions, including sensible steps to reproduce.
Quickly creates sample and test projects to help others with troubleshooting.
Effectively communicates with the QA team (leaving unnecessary emotions aside).
Understands the importance of documentation, starting with code comments and ending with comprehensive user guides.
Has solid writing skills, able to express development-level knowledge of a certain topic in a user-friendly way.
Uses tools for auto-generating API documentation.
Helps other software developers with solving their issues.
Participates in onboarding newly hired colleagues.
Prepares technically oriented "lunch and learn" (or similar) sessions.
Carries out resume-based and phone screening of candidates.
Participates in the interview process, evaluating the candidate's attitude, aptitude and technical abilities.
Gives valuable feedback to the manager to help him/her decide on whether to hire or not.
3rd level support
Has solid communication skills to be able to effectively communicate with the tech support staff, or sometimes directly with the customer/end-user.
Reproduces and troubleshoots issues from (sometimes) partial or unclear descriptions.
Has a solid understanding of the hardware and software that he/she is using and can maintain and troubleshoot it (to a certain level).
Has enough knowledge about basic security principles and ways how to mitigate security risks and vulnerabilities.
Is able to effectively fix most hardware and software errors by "turning it off and on again". 😉
Again, the list above is highly subjective and by no means comprehensive. To me though, each of these skills represents something that requires a software engineer to go a step further from what is traditionally requested from the software developer role.
What is your experience? Would you add something? Please, comment!