A Business Technology Enthusiast’s Guide to Software Engineering

A Business Technology Enthusiast’s Guide to Software Engineering

Basic Software Engineering definitions, concepts, and practices for busy Business Technologists & Thought Leaders.

Introduction

Back in the 1950s, when the dependency on computers increased, the software needed to manage them also grew and thus Software Engineering/Development became a necessity for businesses and users all over the world.

“Our civilization depends critically on software, and we have a dangerously low degree of professionalism in the computer fields.” — Bjarne Stroustrup

In the last 63 years (since 1960), the amount of software produced and used by modern society increased greatly necessitating a need to set principles, objectives, and standards, when estimating the necessary resources (like cost and human capital) for developing quality software to meet customer requirements and manage their expectations.

Today, it is hard to imagine an area of human activity or business endeavour where software is not used, considering most of the devices used in workplaces, households and the large computer infrastructures operating in governmental organizations or large corporations are powered by software.

This publication tries to break down most of the software-related concepts, practices, and topics that anyone in the business of Software Engineering as well as enthusiasts should know about.

What is Software

Software is a set of computer programs that enable a computer system (hardware) to perform specific tasks.

Software runs on hardware which are the tangible components, or delivery systems that store and run the written instructions provided by the software to perform the actual work.

Computer programs are a set of instructions/algorithms applied to various types of data that is used as a process of creating the software program with the help of a programming language.

Characteristics of Software

  • Software is developed or engineered and not manufactured.
  • Software doesn’t wear out but it does require enhancements or scaling depending on how, where, and for whom it’s being developed.
  • Software should be applicable, maintainable, scalable, reliable, efficient, and well documented at the very least to be considered quality when handing it over to the client.
  • Software and especially good software is operational, transitional, and maintainable.
  • Software can also have some restrictions e.g., legal compliances, industry standards, Cost, talent hiring, and time to market among others that need to be considered.

What is Software Engineering

Software Engineering is a technical discipline or approach that applies computer science and engineering concepts in the design, development, testing and maintenance of quality reliable, usable, and dependable software.

During Software Engineering in the business environment, vendors or Software Developers will be subcontracted to develop all, or some components, of the software systems and/or develop the hardware that the software will run on. In this case, the vendors will make a bid by providing proposals (technical and financial capability) in response to a request for proposals (RFP) which are evaluated before the contract is offered.

The professional practice of Software Engineering requires technical proficiency and a high code of ethics, which all enthusiasts of Software Engineering should embody. The 10 commandments of Egoless programming by inspired by the book, The Psychology of Computer Programming , first released in the 1970s, where Jerry Weinberg coined the term “egoless programming” partly speaks to this effect.

“When a Princeton neighbour of Albert Einstein’s discovered to her horror that her little girl had been going to Einstein for help with her arithmetic homework, she apologized profusely. Think nothing of it, Einstein replied — I have learned more from her than she has from me.” -Tweet by Gerald Weinberg

A brief History of Software Engineering

The term ‘Software Engineering’ first was used in the late 1950s and early 1960s, where ‘The Concept of Software Engineering was first discussed at the 1968 NATO Science Committee in (Garmisch) Germany.

The NATO Science Committee sponsored two conferences (The NATO Software Engineering Conferences) on Software Engineering in 1968 and 1969, which as generally believed, marked the official start of the profession giving the field its initial boost as the term 'Software Engineering' was suggested at these conferences to discuss the 'software crisis', a name given to the difficulties encountered in developing large, complex systems in the 1960s (through the 1970s -80s).

Around this period, a lot of software projects ran over budget and schedule, some causing property damage while a few led to the loss of life.

The software crisis was originally defined in terms of productivity, with the term ‘software crisis’ used in reference to the inability to find and hire qualified programmers, but over time evolved to emphasize quality which is how we now use terms like Software Quality and practices like Software Quality Assurance came to life.

By identifying the many of the problems of software development It was thus, proposed that the adoption of an engineering approach to developing software would reduce the costs of software development and lead to more reliable software.

Breaking Down Software Engineering

Software Engineering is a body of knowledge whose concepts and principles can be approached in parallel with the software development life cycle beginning with a general introduction to software engineering, which essentially defines this body of knowledge, as well as the main methodologies of software engineering.

Engineering: Mostly involves applying science, conventional methods, and applicable tools to find cost-effective and sustainable/scalable solutions to developing problems. This can be in any industry where engineering is applicable.

Development: Is the process of developing, being developed, or the result of developing.

Software Architecture: Refers to the fundamental structures or building blocks of a software system. The way software components (subroutines, classes, functions) are arranged and interact or integrate with each other.

Software Engineering: Is a systematic, disciplined & more so quantifiable approach to the development, operation, and maintenance of software or software projects.

Software Development: Is a set of activities conceiving, specifying, designing, programming, deploying, documenting, and testing (bug fixing) involved in the process of creating and maintaining software applications, frameworks, or other software components.

Front-end Vs Back-end Vs Full-stack Development

Front-ends work on what the user can see while Back-ends build the infrastructure that supports it and Full-stacks are both in one. Both Front-ends & Back-ends are necessary components for high-functioning software or applications.

  • Front-end — ensures a satisfactory user experience with no issues, errors, or downtime by planning, designing, building, and implementing quality user interface systems for the software or application in question. Front-ends create and optimize systems, resolve UI/UX issues and even play an active role in testing and troubleshooting activities.

  • Back-end — typically deals with the logical back-end and core computational logic. Back-ends are responsible for the server-side/back-end part of a software or application and usually write the business logic of software, web services, and APIs used by front-end.

  • Full-stack — usually comes with experience of working both as a Front-end and Back-end. Often referred to as “jack-of-all-trades”, Full-stacks have skills in a wide variety of coding niches, databases, graphic design, and UI/UX that enables them do their job well working both the client and server ends.

The case of a Software Engineer Vs a Software Developer

While Developers and Engineers apply advanced technical skills to create computer programs, and their roles overlap in many ways depending on the team one is working on, Software Developers and Software Engineers typically handle different steps when creating applications.

Software Developers identify customer needs, develop, and customize computer software applications, test, and modify the software as needed to meet those needs, for many industries while Software Engineers are considered a type of Software Developer, who apply engineering principles, knowledge of programming languages, architecture, and structural design to build systems and software solutions for end users and are typically involved in all stages of the Software development life cycle.

The Software Developer vs. Software Engineer issue often puzzles many technology professionals and aspiring software professionals may confuse the two positions, because the two professional roles share similar responsibilities and sometimes educational backgrounds with titles often being used interchangeably, but they generally differ in their methods and outcomes.

Software Developers and Software Engineers typically handle different steps when creating applications with Software Developers, often working directly with clients or as part of a team of developers, engineers, and programmers to create software solutions that meet specific user needs and Software Engineers typically working in teams with other developers, project managers, product managers and other professionals considering all components of a project and how potential solutions may affect the project overall.

Also, Software Engineers tend to be in more collaborative roles, while Software Developers often and may work in a more independent environment.

Developer expertise Levels

They are basically 3 levels but, in some places, or companies, you will find 5 or 7 levels depending on the breakdown and classifications of the expertise levels.

As you grow your experience in the Software Engineering industry you will go through several levels based on your expertise.

The 3 common basic levels are;-

Junior Developer:

While starting out, most Developers will be Trainees/Apprentices or referred to as Junior Developer most as commonly known in the software industry. At this level, you probably have 0 to 1.5 years of experience tops and everything you know about Software Engineering is basic at best.

You will work on a team where you either pair, work with or have your code reviewed by another Developer probably a mid-level developer before it gets to the Senior developer or Lead Developer.

Read my Article; — The Struggles of a Junior Software Developer to get a feel of the experience a typical Junior Developer goes through.

Mid-Level Developer:

Mostly referred to as Intermediate Developer on some Job descriptions (JDs) put out by hiring companies or recruiter, a mid-level Developer is any developer with 2–3 years under their belt and has developed a substantial level of technical skills in the software engineering industry.

At this level, a developer has worked on some projects and can work unsupervised on a team among other things or under limited supervision which is typically code/tasks review from the Senior Developer who will act as a guide, mentor, and advisor for the most part.

Senior Developer:

This developer is also known as the Developer Lead or Team Lead and is often referred to as a problem solver, because of their deep, specialized knowledge and exhaustive experience in the software engineering industry, knowledge of programming languages, tech stack, or even a specific product they are working or worked on.

At this level, a Developer has somewhere 5 to 8 years+ of experience and able to handle complex problems, comfortably review other developers’ codes, solve their problems, be a trendsetter when working on projects, and most importantly mentor Junior & Mid-level Developers.

Typically, a software will have functional and non-functional requirements among other client needs to be specified from which an analysis/planning is made to ascertain a scope.

It will have a life-cycle, which is a software process, during its development that involves engineering phases, consisting of concept creation, requirements specification, design, implementation, integration, testing, and deployment.

This process of developing or engineering software is known as the Software Development Life Cycle (SDLC); — “the overall process of developing software from start to finish.”

The Software Development Life Cycle (SDLC) is the process for planning, creating, testing, deploying and post improvement (where required) of a software product. — It consists of stages (Analysis/ Planning, Design, Development/Implementation, Testing, Deployment, and then maintenance.) which are sometimes unchangeable at certain levels depending on the industry, client requirements and team.

As software evolves, it will undergo monitoring, maintenance and continuous improvement cycles and each software development lifecycle model provides specific guidance to the sequencing and repetition of life cycle activities to deliver high-quality software systems.

Key Activities in Software Engineering when managing Software Projects

Project management in a software engineering environment is unique because of the technical aspects of a software project. While software engineers are generally accountable for the technical aspects of a project, the project manager is accountable for organizational aspects. Sometimes a project manager can be the Software Developer on a project.

The success of an SDLC depends on the people, process, and product and software project management is the glue that holds these aspects together.

Software Requirements Gathering and Analysis

During requirements gathering/elicitation, Software Engineer/Developer or Business Analysts interact and collaborate with the various stakeholders, including customers and users, to gather information, assemble the insight, identify, translate, analyze and validate the project's needs about the current state of a software system and desired future state of the software system to be developed. Getting familiar with the data, information types, requirements collection techniques, application types, client engineering techniques can go a long way to help your business case.

Software Design and Modelling

After requirements and analysis, a Software Engineer/Developer must transform the analysis model into a design model that can be implemented in a specific hardware and software environment.

Good Software design is fundamental to creating successful software which starts with gathering requirements followed by precisely articulating complex ideas using industry-standard design visual language tools such as Unified Modeling Language (UML) which enables you specify, construct, and document the artifacts of the software systems among other activities.

Software Implementation

Implementation, is the process of converting the specified requirements into an actual software product. This can be programming, coding source code and execution. Software implementation also involves customer engineering to ensure software is working as expected of the client/end user during implementation and deployment.

In most business settings, steps like implementing, testing (User acceptance testing) and deployment can happen concurrently or inter-changeably depending on client requirements or team.

Software Testing

Software testing is a process of using various industry-standard techniques to show and verify that a software, meets requirements, industry standards and is fit for use.

During software testing, you validate the software requirements analysis, software design, during software implementation to make sure everything comes together correctly to deliver a software system that performs as expected, functionally and non-functionally.

At a granual level, the purpose of software testing is to identify errors, gaps, or missing requirements and check whether the said software product is defect-free and matches the expected client requirements.

Sometimes testing can happen early in the development lifecycle depending on the team workflow, methodology or client requirements but it mostly ensures that the quality of the overall software from varying levels of granularity is as per expectations before sign off or software project handover.

Some types of software testing include; -

  • Functional Testing (Unit testing, Integration testing, System testing, Interface testing, Regression testing, Beta/acceptance testing)
  • Non-Functional Testing (Performance testing, Load testing, Stress testing, Volume testing, Security testing, Compatibility testing, Install testing, Recovery testing, Reliability testing, Usability testing, Compliance testing).

Software Project Handover

Software Project handover is the transfer of roles and responsibilities for a software project from one company, team, or person to another.

It is a complex process that includes user acceptance testing, deployment, acceptance criteria, post hand-over maintenance, project to mention but a few depending on the client or the team handling the software project.

Even though project handover is an important part of the software product lifecycle, it can be costly or take unpredictable turns unless appropriate precautionary steps are taken.

Typically, all stakeholders of the software project are present if possible for the hand over where final sign off take place and the Software product is handed of signaling the end of the project and making way for any post-project activities like support, maintenance and continuous improvement

Conclusion

Software Engineering/Development outside in the business environment is a very complex process, mostly because real-world software is much larger, more complex and run on big budgets with a lot of uncertainties, timelines and often unreasonable expectations from the various stakeholders.

"Programming isn't about what you know; it's about what you can figure out." – Chris Pine.

It is a lucrative venture and getting proficient or mastering the various software engineering concepts, principles, essential processes and industry standards can give you an edge in the cut-throat competitive technology space.

There are several areas to focus on within Software Engineering, such as Programming Basics, Software design, Software Processes, Software Project management, Software testing, Software Quality Assurance(SQA), Configuration Management, Database Design and Administration, Human-Computer Interaction, UI/UX Concepts, Operating Systems, Computer and Software Architecture, Software Modelling and Analysis, Embedded Systems, ML/AI & GenAI, Computer Networking and Security concepts, Research and Development(R&D)/Research Methodology, Data Structures and Algorithms(DSA), Technical Writing and Social Responsibility/Legal & Ethics among other disciplines.

These can be different or categorized differently depending on the information source, learning center or mode of research on your part.

Reading Resources

Tags

Software Engineering, Software Developer, Software Engineer, Software Development, Software Crisis, Software Quality Assurance, Software Testing,Software Development Life Cycle (SDLC), NATO Science Committee, The NATO Software Engineering Conferences