This is part of the series of blog articles called “A Writer’s Guide…”, check out this article by writer Christopher T. Mooney on being a Software Engineer.
by Christopher T. Mooney
Software Developer and Software Engineer are two relatively interchangeable titles for the same set of job duties.
While some Software Engineers will argue that if an individual does not have a degree in an engineering field of study that person should have the title Software Developer, in practice this is largely up to the company or entity for which the person works.
This can sometimes lead to consternation and disdain on the part of the person with the engineering degree for those that have Computer Science, other formal degrees or for persons who have no degree or graduated from a “code camp”.
Software Engineering jobs are as varied as the colors in a large box of crayons. They range from working on large, enterprise-wide software systems to software on isolated, single-purpose devices.
As software becomes more specific to a single device, requiring specialized techniques and supporting software to create, it is often termed firmware.
Such specialized software engineers are called firmware engineers and typically have some background in hardware engineering, whether Electrical Engineering, Computer Engineering or another related field.
The rest of this article will be about more general software engineering, but the same fundamentals apply to firmware engineering.
Software Engineers and Developers are typically individuals with a Baccalaureate degree in Computer Science or Computer Engineering, however, there are many paths to becoming a Software Engineer that have nothing to do with those degree programs or even university-level studies for that matter. Of course, it goes the other way as well, with some developers holding advanced degrees.
The qualifications that matter most in software engineering are the individual’s ability to think critically and analytically and the ability to learn new and varied software technologies quickly, applying them to a real project that will impact an organization’s business.
Often that business is merely being enabled by the software, not producing the software itself, so efficient, self-educating individuals are preferred.
In large software organizations, degrees and certifications are generally far more important than in small organizations.
One exception, at least in the United States, is any company that is being contracted by the government is only allowed to charge the government hourly rates based upon the qualifications of the individuals performing the work.
Equipment and Tools
A software engineer typically spends long hours working on creating software for computing devices. While the target system or type of application may range from web to mobile, server to desktop, there are some common tools that they use for creating that software.
Personal Computer: The software engineer will typically need some sort of personal computer to create software, whether the target device for the software is a phone, tablet or servers in “The Cloud”.
This is because most of the software tools used for programming will only run on a full-fledged personal computer due to the hard drive space, operating memory and processor speeds required to run these tools.
A personal computer will often be a very high end laptop or a desktop running either Windows, MacOS or Linux as their operating system (or even sometimes switching among them).
This is changing, though as there are now online programming tools that allow the developer to do all of their work through a web site that runs on servers in “The Cloud”.
There are also some high-end tablets that are essentially small-form-factor laptops that are capable of being used as development computers.
Integrated Development Environment: An integrated development environment, or IDE, is a single software application that runs on a personal computer and includes all of the tools a software engineer needs to create software for their target device.
Typically an IDE includes a text editor for writing programming language code that will color various syntactic parts of the code different colors to help the developer quickly read the jumble of keywords, variables and other programming elements.
The IDE also includes a compiler which is used to convert the programming language code to some form of machine language file that can be executed as a running program on the target device.
It will also generally include a debugger which is used to step through the executing code one line at a time as the program runs in real time either on the developer’s computer or on the target device.
This is used to determine why the program is not executing as expected and fix the bug by changing the code and re-compiling the software.
While there are many IDEs, some of the most popular ones, according to PYPL (https://pypl.github.io), are: Visual Studio, Eclipse, Android Studio (programming for Android phones and tablets), Netbeans, IntelliJ, Sublime, Atom, Visual Studio Code, pyCharm, and Xcode (Apple MacOS/iOS software development).
Version Control System: All professional programming organizations use a version control system. This is a software tool that allows a software engineer to store copies of their code and share it with other developers.
The key behind version control is it allows incremental changes to code files so that if a developer introduces a bug while writing software, an older version of the same code file can always be retrieved from the system.
Most version control systems also have a way of marking the version of a code file that was included in a software release so that a part of a development team can pull the same code that was in the software release and create a fix for a problem found in the version that has been released while other members of the team continue to work on changes to the same code files. Some popular version control systems are Git, Mercurial and Subversion.
Programming Language: A programming language is what a software engineer uses to communicate their intentions to the compiler as to what they want the computer to do, but is also a means of communicating to other software engineers what the program is supposed to do.
Programming languages consist of simple instructions that can be expanded upon by the developer to create a set of steps that the computer should follow.
This set of steps can be anything from performing simple math calculations or displaying text in a word processor to rendering an immersive 3-D Virtual world that the user can interact with through goggles and haptic gloves.
A programming language is usually selected based upon the intended target device, although many languages can be compiled to run on different devices, they may be more suited to or more popular for a particular device.
For instance, even though Java has a robust graphical user interface portion to the language that could be used to create a word processor, it is not one of the more popular languages for doing this, and is seen being used more in programming server software, DVDs and Blu-Rays.
Other languages, like Swift, are largely used by a single community. In this case, developers creating MacOS and iOS (iPhone) apps.
Code Libraries: Software engineers are generally hard pressed to produce working software as fast as possible. Because of this, they do not have the luxury, or often the expertise to write all of their code from scratch.
They may need to create an application that displays a 3-D image, but not have any idea how to write such complex software, so they use what is called a library.
This library is a collection of code written by another developer that provides an Application Programming Interface, or API, that provides code elements that the harried software engineer can use to create her software without having to understand or write a line of graphics code.
All they have to understand is how to integrate the library into their code using the API. An API can be something that is directly integrated into the application that the developer is creating, but can also be special web applications that do not display web pages, but provide data from servers, or allow the developer’s program to use more powerful computers in “The Cloud” to perform extremely complex calculations that could not be done on a stand-alone computer in a reasonable amount of time.
Many developers today choose to use what are called Open Source libraries to create their software because they are often free to use and the source code files for the library are freely available for review so the developer can be sure that they do not do anything malicious.
In practice, though, even if a developer took the time to review the code, they might not understand what it is doing due to the complexity of what some of these libraries provide. Graphics, cryptography, security and advanced mathematics are just a few examples of capabilities provided by complex libraries.
Processes and Procedures
Professional software developers use many processes and procedures when creating code. Unless a project is very small, it is rare that a single software engineer is working on code by herself.
Commonly teams of individuals are working together and use these processes and procedures to control software quality and manage the changes being made to software or creation of new software.
While there are about as many variations in these processes as there are software development teams (and in some cases developers), some common processes follow.
Agile Development – Agile development is a project management style that is centered around the Agile Manifesto, which boils down to valuing working software that is built through continuous, direct interaction between the developers and with the customer for the software over anything else.
While simple in concept and its wide adoption, it has proven that a great concept can be implemented in many horrible ways. Scrum is a popular methodology for implementing this concept and while tailoring of the processes described by it is normal it has been widely abused.
Agile Development is blamed for project failures when the tailored (or ignored) processes the company put in place are to blame, often at the behest of management or customers that do not understand the process.
Agile processes vary, but are generally centered around a very short timespan to design and develop a small subset of the total number of features that will be part of the final product.
This time period is as little as two weeks per cycle and is capstoned by a demonstration of features to the customer and a period of reflection by the team on what they can do better next iteration.
The concept behind this being that the working software developed during the iteration could be immediately deployed if the customer approved.
Waterfall Development – An old development method where the design work with the customer is all done up front with very limited prototyping followed by a development period, a test and fix period, a user acceptance period and a final deployment.
The duration of the development through release and deployment is often set up front when there is little understanding of the actual work to be done and rarely does a project stay under budget or time when using this method.
Peer Review – Professional software engineering groups, to protect code quality and prevent bug infested code or code that can harm the system intentionally or accidentally will not allow code to become part of the main code base in the source control system without it going through a peer review.
Peer reviews are conducted using software that allows the developer to see the differences between the way the code was before the change and the way the code will be after the change, much like track changes works in a word processor.
Whether peer reviews are effective when conducted solely by visual inspection of the code changes is a holy war that crops up in most development organizations, and there is always that one developer that manages to circumvent them to “get work done” as they see it.
Quality and Acceptance Testing – The software engineer will usually, at least peripherally, be involved in end-user-style testing of software.
This type of testing is generally known as Quality Assurance testing and involves verifying that a feature works as designed. Verification and Validation testing may be done at this time to verify that what the development team set out to build got built.
This is often followed by customer acceptance testing where the customer gets to use the software in an uncontrolled manner to see if it is what they were wanting.
This phase can be disastrous in Waterfall Development if the customer is not happy, as it leads to months more redesign and rework, where in Agile, it gets fixed the next iteration if the customer values the change.
Unit Testing – Unit testing is a type of testing where the developer writes code that exercises the code that she wants to contribute to the project with controlled inputs that can be compared to expected outputs.
This code becomes the gold standard for the operation of the unit, and when the code in that unit changes, running the test code will verify that it still has the correct output for the input.
Changes to a unit mean that a new feature was added or a bug was fixed and may drive more test code being added to the tests for that unit for future verification.
Branching Code – Professional software engineers will, before working on a section of code, make a branch, or copy, of the code using their version control system.
They then make their changes on this branch and are able to share it with others so that others can contribute to or review the changes before the changes are merged back into the main codebase.
This makes certain that the developer or developers do not accidentally put unfinished, unapproved code into the code that will be part of the next release of the product.
Merging Code – Code is merged from a branch to the main code base, also known as the master branch.
Most organizations require peer reviews and passing unit tests as well as Quality Assurance tests before the merge is allowed. Technically, merging can happen between any branches of the code, but that is a complex discussion even or the initiated.
While there are many other activities that software engineers participate in around the creation of software, perhaps the one most recognizable activity is that of writing code.
While the image of a lone individual tapping away at a keyboard late into the night, the glow of green or amber text illuminating their face and reflecting off of their thick glasses, to create some new, novel software is sometimes the case, most software engineers spend most of their time writing small amounts of code to bridge together existing technologies.
While it might seem like the person writing code from scratch is producing more, economically it costs less in the long run for a software team to use existing, well tested and maintained technologies and minimal custom code.
Every line of code has to be tested and maintained, and either purchasing code libraries or using open source libraries not only speeds development but puts the burden of testing and development of that technology on another organization so that the engineer can focus on the problem at hand rather than re-creating underlying technologies.
With that understanding, an average, professional software engineer will follow a process similar to this:
Be assigned to, or self assign a task from an issue tracking system. This could be anything from an emergency bug fix to a new feature to implement. This may come from an Agile Development process.
Research the problem or feature and potential ways to make the change. May involve a Software or Enterprise Architect in making technology decisions, including brining in code libraries or existing software such as databases, message queues, etc.
Create a branch on which to work the issue. In the case of green-field, brand-new software the engineer will create a new code repository in the version control system.
Write or change code that fixes the issue, or implements the new feature. This can be as small as a few lines of code changing or as large as an entire new web application.
Large changes will be broken up among many text files. How many depends on how good the developer is at their craft and the programming language being used.
Create unit test code to test the change or new code.
Commit the branch to the version control system.
Request a peer review to have the code merged to the master branch.
Help in writing Quality Assurance as well as Verification and Validation tests
Write other documentation as required.
Once the peer review is signed off on, participate in the merge and send the issue on for testing.
While the bulk of this has been about when, where and how a Software Engineer does his work, no discussion would be complete without the culture and social environments in which these animals work.
In today’s gig economy there are many engineers that may work for many companies from the comfort of home.
In this case they must have excellent communication skills and work quickly and intelligently otherwise they may be relegated to long hours. Software Engineers are most interesting, however when they are thrown together in groups and the social dynamics play out.
Spats about programming languages, friendly arguments about technologies and holy wars about IDEs are typical points of conflict and differing opinions.
Younger groups of developers may get together socially outside of work, and there have been more than a few workplace romances between developers.
Some developers have a fierce sense of being the one with the right answers and evangelize their points of view while others follow as disciples and still others ignore them.
There are a great many introverted engineers since large portions of time are spent with a computer as their only companion drawing those that are energized by spending time alone to the profession.
While this is largely the case, most are also capable of extroversion when with other engineers; likely because they find others that truly understand and can commiserate with their problems or comprehend their successes.
While the archetype may be the comic reading, sci-fi loving, Monty Python quoting, role playing, video gaming, long haired, bearded geek, and there are are those out there, the reality is more varied.
There are Software Engineers that are parents, sport fans, mountain bikers, base jumpers, reserve soldiers, couch potatoes and just about any other type of person you can imagine.
They are men and women of every ethnic background originating from almost every socio-economic class. Anyone, with access to a computer and the right drive can learn to program and become a professional Software Developer.
~ ~ ~ ~ ~ ~ ~ ~ ~
About Christopher T. Mooney
By day, Christopher T. Mooney has been working as a software engineer for over twenty years.
By night, he is a husband, father, handyman, home remodeler, martial artist and, yes, even writer.
He is the author of the Zandeji Chronicles series of novels and the Miami Knights series of short stories.
He writes faith-based science fiction from his secret lair somewhere in the Midwestern United States.
I hope you enjoyed this article and if you have any questions for Christopher, drop them in the comments below. Check out all the current “A Writer’s Guide” articles on their new page for easy access.
Do you have knowledge of a skill or occupation you could write about?
~ ☆ ~ ☆ ~ ☆ ~ ☆ ~