Sign In

Communications of the ACM

BLOG@CACM

A Tale of a Non-Traditional Software Engineer


View as: Print Mobile App Share: Send by email Share on reddit Share on StumbleUpon Share on Hacker News Share on Tweeter Share on Facebook

As more and more jobs in computing and information technology become available in today's market, it makes sense that engineers without a traditional computer science background are taking an interest in them. I myself am one of those individuals—I entered college as an undergraduate with a major in biomedical engineering, but realized more than halfway through that I was more interested in pursuing a career in computer science. It was too late for me to completely change course, so I ended up just partially shifting, graduating with a minor in CS and just a small foundation of knowledge that included an intro to object-oriented programming (in Java), data structures, algorithms, and operating systems. I did not have enough time left in my degree to take other fundamental computer science courses such as databases, networking, and software design.

As a result and not surprisingly, I struggled to find a job after graduating, as many companies would not even consider me for an interview despite my 4.0 GPA. Even for the interviews that I was offered, I struggled with the traditional, code-on-the-spot software questions because of my limited programming experience and lack of confidence. But one company saw potential in me and gave me the opportunity I was looking for, opening the door to rapid learning, growth, and development in the computing sphere. This article provides my own perspective on the most valuable knowledge and skills I obtained from my undergraduate experience (including those specific to my limited computer science curriculum, and more general ones), as well as the particular characteristics of my job environment, teammates, and culture that accelerated my growth in the field. These perspectives can help provide insight to other junior developers, educators, managers, and mentors alike into effective strategies for fostering young professional growth in the software industry.

Computer Science Foundation

My CS minor course of study included the following classes, ranked in order of importance to my career:

  • Intro to object-oriented programming (in Java)
  • Data structures
  • Algorithms
  • Operating systems
  • Discrete mathematics
  • Linear algebra

The first course, both in chronological order and ranking, covers basic object-oriented programming. This was most important to my own educational development as a software engineer for two reasons.

First, it is what helped solidify my interest in computer science when I was still tentative about venturing into the field. When the concept of a Java class hierarchy finally clicked for me as I completed the classic "shape" design problem (where concrete classes representing circles, triangles, squares, etc., descend from abstract parents like "shape," "rectangle," "oval," and so on), my junior mind was blown; I was proud of what I had finally understood, I realized the design possibilities were endless, and I wanted to do more. Following from that, this course's content is easily the most frequently utilized in my software career today, where I work on designing a Java model for an electronic health record Web application. One could argue that this outcome is a result of my educational circumstances; in other words, my career has taken me in the direction of Java development because of my initial foundation and interest in object-oriented Java modeling, but regardless, I would not still be in the software industry today if I hadn't taken this course.

Data Structures (lists, sets, arrays, maps, etc.) is another course whose material I use heavily in the professional sphere. While not as critical to my personal development in the software realm, this was still another course that was necessary for my success in the computing industry.

From there, the importance of the remainder of my computer science courses begins to decrease. In both Algorithms and Operating Systems I picked up some useful basic concepts (for example, Big-O in Algorithms and simple command line skills in Operating Systems), but I don't utilize the more advanced subject matter from those courses day to day. Discrete math was even less important, and linear algebra was far too theoretical to be useful in my more practical interviews and job tasks. In summary, object-oriented and data structure skills were noteworthy in my professional development in software, but other specific courses held less importance.

General Engineering Skills

Outside of computer science fundamentals, I obtained other skills from my general engineering education and research experiences that made me successful in my software career. These skills are essential to success in any engineering discipline, but here I will expand on why they are particularly important in the software industry. In my opinion, these skills are important to look for in new hires of any age and will produce a successful engineer far more often than raw computer science knowledge.

Engineering communication skills can and should be refined and improved throughout an engineer's professional career, but there is a basic proficiency level that one must have to start out with. Oral communication is necessary for quality interactions with managers and mentors, status reporting in scrum meetings, conversing with non-technical team members such as product managers and QA, and asking for help. Written communication is crucial for participating in code reviews, writing good documentation of software, and engaging in message-based discussions in today's increasingly remote and digital environment. In all of these areas it is important to communicate both clearly and concisely, and with an awareness of the audience's point of view, goals, and interests. I meet many engineers both young and old who can describe a brilliant design strategy in great detail, but then fail to realize that the group they are speaking to—whether it consists of customer-facing product owners or even their fellow team members—just doesn't understand the relevancy. I feel that my own communication skills are the single most important factor in my growth as a computer science professional since I graduated, and I consciously continue to work on them as I advance in the field.

Critical thinking skills are also important for any engineering professional, for the purpose of continuous improvement. In software especially, we strive to streamline our work by automation, always becoming more efficient and eliminating repeated time-consuming manual tasks. We also iterate on our products and refactor our code, making everything more clear, functional, and maintainable. Continuous improvement is a philosophy that comes as second-nature to a good software engineer, and requires looking at the product and the processes around it with a critical eye. Critical thinking also makes for good debugging and troubleshooting skills, thorough testing practices, and strong development of risk mitigation strategies. All of these are extremely valuable qualities for a software engineer and important for growth in the field—the best candidates for key project leaders, managers, directors, and architects are those with a continuous focus on improvement.

In conjunction with critical thinking, it is also important for young software engineers to take initiative, for a few different reasons.

First, the ability to spot weaknesses in a software design means nothing if not accompanied by action to fix them, so initiative is needed to make all of the advantages of critical thinking worthwhile. Second, a software developer's drive to take initiative results in faster learning and technical growth. We all need to take initiative to learn new languages and technologies, and engineers who have the confidence and motivation to do this will advance quickly, regardless of their initial background.

No matter how long we've been in the software field, we all need to engage in continuous learning to prepare for new projects and roles and keep ourselves relevant. For this reason, an engineer with the initiative needed to conquer a learning curve is incredibly valuable, far more valuable even than one with just a lot of background knowledge.

Finally, engineers with initiative will take on a deeper level of engagement with the company's projects, going above and beyond their assigned tasks to perhaps lead new efforts or make new connections. This can have the combined effect of increasing their value within the company, making their day-to-day job more fulfilling, and improving their prospects of being noticed and nominated for promotions and other advancements.

While not directly related to a computer science education, the core skills of communication, critical thinking, and initiative are important to instill in undergraduates wishing to enter the software engineering discipline, and important to look for in new junior-level hires.

Job Environment: Opportunities and Benefits

I believe that certain characteristics of the professional environment can contribute to accelerated growth in junior engineers. Not every workplace is the same, and some cultures and teams foster young developers' success while others may actually stagnate it, discouraging them from continuing on in the software field. I was lucky that my first job out of college was in a growth-friendly environment, with solid role models, kind mentors, and a caring manager. There is no standardized formula for a "good" development workplace, and certainly every new engineer has unique needs, but I can expand on the aspects of my workplace that were beneficial for me as a new graduate with very little experience.

Starting with my first phone screen for the job I eventually accepted, coworkers at my company always placed an emphasis on learning. I received frequent book recommendations, a few of which had huge impacts on my coding foundation. Senior developers at my company hosted group lunch-and-learn presentations on a variety of topics, and I got a chance to present a few myself, which also helped boost my communication skills. My team also held our own small-group learning sessions, where we had weekly opportunities to give a short demo on any new software technology or topic we found interesting. All of this had the combined effect of expanding my specific knowledge on the subjects I learned about, keeping me humble and open to new ideas and ways of thinking, and instilling my own focus on the importance of learning going forward in my career.

In our day-to-day work, collaboration was largely emphasized: my teammates were always quick to jump on opportunities for paired programming, debugging, and mentoring, all of which helped me to pick up new practical skills and knowledge that I've carried on throughout my career. I actually spent a few months partnering on a sustained project with another more-experienced engineer, and picked up lots of new ideas on coding, debugging, and testing through our shared work. Additionally, my team maintained highly productive code reviews, and I learned better coding practices by observing others' styles and comments. I also received gentle feedback from them on my own work, which helped me to continually make meaningful improvements to my own style. I was pushed outside of my comfort zone in many ways, but ultimately that helped me to develop confidence and motivation, in addition to new knowledge and skills.

Finally, I had the important benefit of a very attentive and caring manager, who I still hold as a role model in aspirations for my own career path. The positive feedback I received from her and other mentors helped reinforce the progress I was making and made me excited to keep learning, growing, and improving in the field. She took the time to work with me regularly on my overall career plan, which is a conversation that all managers should have with their reports, but should not ever be taken for granted, because not all managers do it. I think that a manager can all too easily make or break a junior developer's software career, and I was lucky enough to have one of the best.

Conclusion

In my experience in the software industry so far, I believe there are three high-level elements that make a strong software engineer: educational background, general engineering skills, and a growth-oriented job environment. As someone who did not have a traditional computer science education, I place a stronger emphasis on the latter two: a strong education can help a young engineer land her first job more easily, but that same knowledge (plus much more) can be gained just as easily on the job by a person who is motivated to learn with a team who is willing to foster that learning. The initial advantages gained from a degree in computer science are not permanent, and in the long term it's not the degree that matters, it's the person.

 

Abigail Walker is an application software engineer at Ontada.


 

No entries found