Originally published to Builtin - April 28th, 2022
Getting a degree in computer science is one of the most popular ways to a career in software engineering, but there’s sometimes a disconnect between the skills students learn in college and the ones they most often use in their jobs after graduation.
While computer science coursework focuses on how computers are built and function, software engineers need to understand how to leverage software frameworks and choose from software design patterns to write different kinds of software programs. They need to be knowledgeable about innovative software tools and whether those tools can help them build software more efficiently. But some important aspects of software engineering aren’t technical at all, such as learning how to work effectively within a team to write code together and how to communicate and debate programming ideas.
And that’s pretty different from what students learn in college about computer science theory and algorithms.
“I’ve been in this business for 10 years, and I did not write a single algorithm,” said Ahmed Alamer, senior software developer at real estate investment platform LEX. “Somebody else did that, usually in a library that I conveniently use.”
That’s not to discount the value that a computer science education can provide. It takes a diverse set of skills to be a good software engineer, and sometimes having a deep understanding of computer systems can help software engineers improve their software in important ways. Computer science programs are also great for introducing students to the wide range of topics within the industry, especially for students who never had any exposure to computing before college.
What students value in their college education experience points to all the different skills needed for a career in software engineering. Here, several software engineers shared what they learned in college that came especially handy in their careers — and what they wished they had learned.
Wishing for More Hands-On Experience
Alamer attended both undergraduate and graduate school in computer science. Some of his favorite classes were ones on the operating system, where he learned about how the operating system is built, how memory management is handled and how CPU scheduling works. He enjoyed that what he learned in class could be immediately applied to the software he wrote.
“In my career, as I started to learn the low-level stuff, I felt more empowered as an engineer and I was able to solve more difficult problems just by knowing what goes under the hood,” he said.
After taking those classes, Alamer was able to learn multithreading on his own and use that technique to make his programs more efficient. He was able to find performance bottlenecks in his code and scale up programs correctly.
But Alamer wishes that the systems classes he took offered more opportunities for students to learn by doing hands-on assignments rather than being focused mostly on the theoretical justification of how systems are built. Once he started working, he felt that having the additional practical experience would have been helpful.
“Sometimes I wanted to do things at a low level … and then I go in and see the code or see the implementation architecture,” he said. “And it’s strange to me, because I get it on theory, but I wish I knew how to translate that theory into implementation.”
Getting the Fundamentals but Missing the Bigger Picture
When Bryanna Valdivia went back to school for a master’s degree in computer science, she was hoping to transition to a career in tech after studying linguistics and economics in undergrad.
She took classes in operating systems and computer architecture and learned the basics of coding in different programming languages. But while the program introduced her to many different aspects of computer science, she never felt like she understood how it all fit together and applied to a software engineering career.
“It was very hard for me to piece together the bigger picture of why I’m learning each of these things. I’m not seeing them connect right away.”
“It was just a really wide range of topics to learn within the field, which is exciting and cool,” Valdivia said. “But also, it was very hard for me to piece together the bigger picture of why I’m learning each of these things. I’m not seeing them connect right away.”
Although each class was self-contained and she understood the coursework, she didn’t feel like she was getting a better understanding of software development. Eventually, those concerns — combined with complications due to the start of Covid — made Valdivia decide to quit her master’s program and enroll in the Hack Reactor software development bootcamp.
It was a rigorous program, consisting of 12 weeks of immersive classes that included individual and group projects. But Valdivia felt the program made an effort to tie together concepts in a way that helped her understand the bigger picture. Each concept that students learned built on top of previous topics, and it was clear how each new skill could be applied to software engineering.
For Valdivia, who now works as a support engineer at e-commerce fulfillment company Deliverr, the positive bootcamp experience validated her feeling that it was important to see the bigger picture while learning about computer science concepts.
Learning More Software Engineering Concepts
When Vincent Finn arrived at college as a computer science major, he had no prior programming experience. The classes he took on programming languages, data structures and the operating system during his first couple years at college gave him a solid foundation in computer science.
But what first sparked his passion for software engineering was a class he took on software design patterns. It taught students how to code using common software patterns to create programs that suited different types of solutions. Taking the class, Finn realized that computer science was actually quite different from software engineering.
“Computer science is more about the science of how computers work, the more theoretical aspects,” Finn said. “But that design patterns class gave me insight into the world of software engineering, which is something slightly different — it’s more about thinking about how to develop software efficiently and the right way.”
Another software engineering class he took on test-driven development and extreme programming became his favorite class in college. It taught students how to write code that is easy to read and easy to maintain, and how to work within teams of developers in ways that make the development process more effective and efficient.
“That class really changed my perspective on writing software and what it means to write good quality code — why that’s important and ways to go about doing it,” he said.
These days, Finn works as a software developer at Focused Labs, a software consulting company. After a number of years of working in the software industry, he also wishes he learned more about common innovative technologies used in the industry during college, like how to deploy code using containers and manage them using tools like Kubernetes.
“Coming out of college, it probably would have been helpful to at least be aware of some of that,” Finn said.
More Teamwork Practice
When Sean Connolly was a computer science and computer engineering double major in college, his favorite class was a web application development class he took during senior year. Students used the Ruby on Rails framework to build websites and learned to do full-stack software development.
Working on projects in the class, Connolly learned how computer science concepts applied to software development work. Before his experience in class building websites, web applications all seemed like black boxes. But in class, he got to see all the steps that happened during web interactions — how after a user makes a request, the browser loads an HTML file, which in turn fetches other files like CSS for styling and data. Working on entire web application projects helped him understand how it all fit together holistically.
“There’s all kinds of interview questions that will ask you, ‘Tell me what happens when I type in a domain name into a browser,’” Connolly said. “To have a firm understanding of all the different pieces that are involved, that definitely requires some experience of building something that’s complete.”
Although he enjoyed the hands-on programming experience, after he started work as a software engineer, he realized engineers needed a lot of interpersonal skills as well. Developers in all kinds of companies have to work with others, whether it’s cross-functionally with people on design and product teams or with other developers on the same team. A common practice on development teams is giving and receiving pull request feedback with other developers.
“The people who do well know how to take that feedback with grace, and the people who do poorly are the ones who get defensive and they get their ego involved ... It’s so challenging to undo those habits once people have been doing it for a while.”
“The people who do well know how to take that feedback with grace, and the people who do poorly are the ones who get defensive and they get their ego involved,” Connolly said. “It’s so challenging to undo those habits once people have been doing it for a while. You could totally teach that — you could save people a lot of trouble by preparing them for that type of situation.”
Instead, he’s had to pick up many best practices of working effectively on teams through trial and error. Although it’s unusual for computer science programs to have classes dedicated to teaching collaboration, it’s not unheard of in other professions. For instance, Connolly’s wife, a professor of nursing, took classes as a nursing student that focused on building good cross-functional professional relationships with doctors and administrators.
Connolly, who is now director of engineering at communications platform company Gloo and writes about software development on his website, said that learning these interpersonal skills is important for software engineering. Participating in team projects and learning about agile development processes may also be good ways to pick up those skills.
Fundamentals Are Still Important
When Niko Lazaris was a computer science major in college, he was disappointed by a disconnect between the theoretical topics he was studying in class and the software engineering skills he knew were important in the industry.
In order to bridge the gap, Lazaris joined many computer science student groups at school and focused on gaining practical skills like mobile app development and being able to use tools like Git. But after graduation and a number of years working in industry, Lazaris, who is now a senior software engineer at Drift, thinks he might have “overcorrected” by focusing so much on gaining practical software development skills in college rather than learning theory.
“It wasn’t until I got into industry and got more experience that I felt I had the context of why I learned that in class.”
“It wasn’t until I got into industry and got more experience that I felt I had the context of why I learned that in class,” Lazaris said. “Having that context helps me appreciate what I learned in some of those fundamental classes I took in computer science, and it actually makes me want to go back. What else could I have learned that if I had the right context would be really valuable?”
After he got to the workplace, concepts he learned in school like using Big O notation to calculate the comparative efficiency of code gained new relevance. He thinks it could be helpful if colleges encouraged students to participate in internship programs early on.
Computer science is abstract, so it can be hard for students to understand the significance of what they’re learning in class if they’ve never seen those concepts in practice. Students just starting to study computer science should take the opportunity to get hands-on experience as early as possible through internship programs or by working on side projects on their own — doing so may help them to contextualize the more theoretical topics they learn later in class. Working on projects within teams would also be helpful for introducing students to software engineering team dynamics, and may also expose them to popular technologies being used in the industry.