The Engineer

18 Dec 2020

Engineering Software

I love the term “Software Engineering”, because anything sounds more impressive when “engineer” is added to the title. I originally wanted to be an audio “engineer”, which is a very kind way to describe a starving artist working in a recording studio. Sure, a great audio engineer probably knows some of the scientific aspects of recording, like sound waves, frequencies, electricity, and has a working knowledge of how these things might affect the quality of an audio recording. However, I certainly never needed to understand physics or circuits on the level required by a mechanical or electrical engineer. Even in the IT world, it is certainly much more impressive to have a degree in computer engineering over computer science. Engineering makes implies a high technical understanding and a thorough background in underlying concepts that support the associated field of work. So what differentiates someone who writes code from a person who engineers software? What is the difference between a developer and an engineer?

Foundation

Software engineering is perhaps a more loose application of the “engineer” title, since software is a completely made up concept. Many other types of engineers leverage some knowledge of natural sciences to their work, while programming languages have provided enough abstraction to the process of creating software that a skilled software engineer doesn’t even necessarily need to know the basics of how a computer works. There are some exceptions, of course. For example, programming in C can be difficult without a deeper understanding of how computers access memory and the difference between the stack and the heap, which is important when attempting to use pointers. However, even that level of understanding is far above the basic function of a computer, which at it’s most basic level is simply an on/off switch running at an incredibly fast pace. Computer engineers worry about how all that stuff works, and software engineers operate at a level that is abstracted beyond the 1’s and 0’s, past the machine language, above the compiler, and ultimately do most of their work in natural english-language that a complete layman might be able to analyze and understand. There are no greek letters to represent constants, just this man-made concept of how to use a man-made machine. So what right does a software engineer have to refer to themself as such?

Building the structure

Though not as scientifically rigorous as the work of another engineer, the role of the software engineer is no less important. Indeed, our world has evolved to the point where software is truly ubiquitous, both in the work-place and in recreation. Software engineers have created so many ways to use computers to bolster infrastructure, transportation, medicine, and entertainment. Becoming a software engineer opens the doors to being able to create incredible things, and the tools to do so are the results of software engineers over many years. To help engineers of the future, previous software engineers have created standards and established best practices that ensure each new generation of engineers is able to grow the field and develop new things that transform technology. While computer engineers are working hard to create better and faster number crunching machines, software engineers find new ways to crunch the numbers at a pace such that we can create things we could only dream of within a decade. Of course, this kind of work requires many great minds, so as our collective ability to create grows, so much our ability to collaborate with other software engineers.

Over the past few months, I have learned many concepts that are transformative in my ability to work with other developers. The norm for most companies that create and sell software is to use the approach of rapid-application developement, wherein goals are established, broken into parts, solved and then put back together for a new version in as little as a week. This break-neck pace requires that everyone is on the same page, and I have learned how difficult, necessary, but also rewarding it is to master this agile method of development. To have a promising career as a software engineer, I believe there are certain skills that are entirely necessary to be able to survive in the world of tomorrow. Coding standards ensure that style is consistent between the work of many heads, enhancing the ability for people to tackle any issue that requires an extra pair of hands and eyes to complete. Design patterns, which are tried-and-true methods of accomplishing specific needs of a software package, can be decided on before development even begins to make sure a whole team of developers is using the same blueprint as the work begins. Deciding on a development environment and creating one for each engineer ensures the whole team is using the same construction materials and can hand off any part of a project seemlessly.

The Capstone

Even after years of study, I feel that my journey into the world of software engineering is just beginning. Building the foundation of knowledge and mastering tools is a never-ending process, and I am confident that within my lifetime, I will see new creations come to life that are beyond my imagination. I intend to push myself to keep up the pace so that I may eventually contribute to something that is transformative and ground-breaking. In a few short months, I have added some great tools that I can leverage towards that goal, and I am excited to see what else I can master to help me reach the top.