Software Engineering

Software engineering is no less than an art, yes a mystic one. It is a process of creating software applications, with less bugs (debatable) and causing less trouble to the software developer. It is the practice of starting the process of software development with concise and well-known and understood requirements, and then keeping a track of what is expected from the software, and how can that change — that change must somehow reflect in your present codebase. The practices in software engineering require the product, which is to be built, to be known before you start developing procedure and the drafts must be built on which you then have to write the application.

Just like engineering practices, a software engineering team considers thorough research, feasibility report, design, approach and then procedural development through well-defined and tested methodologies and tools. And once a software has been developed, software engineering defines the steps and practices to perform in order to keep the software up and running and to maintain any problems with it or the expectations.

Software engineering in general

Software engineering requires the software development teams to understand the requirements before starting to develop the software so that there are less faults in the product, and there are less ah, we missed that sort of thing. There is a complete software development life cycle, that gets introduced depending on the software that you need to build and each time a software has to be developed the life cycle is what has to be shifted from one side to another to ensure that you get what you need. As in, you bring more days to the requirement understanding phase, and sometimes you give more time to development phase, or sometimes both.

But the practice remains the same, you work hard to ensure that you only take a step, if it's on a solid ground.

Software development life cycle

As mentioned, the software development life cycle is the iterative process (or in some cases, a sprint race) toward the software development. The process comprises of multiple stages where teams organize themselves, and communicate within the team or with the customer and stakeholders to understand what they have to build and what they are building to understand whether they are on the right track or not.

There are multiple (and even more than many) methodologies of SDLC,

  1. Waterfall
  2. V-shaped model
  3. Iterative and Spiral
  4. Big Bang
  5. Agile

These methodologies have their own design, procedures, shape and requirements that they expect the team to embrace before implementing them in their software design and development process.

Method Easy to learn Flexibility Good practices Iterative approach
Waterfall Yes No Sort-of No — yes, if considering from start again
V-shaped model Yes Yes Yes, as it enforces testing of each phase Same as above
Iterative and Spiral Yes Yes, as software is not developed in a single go. Yes — no if each iteration has to be and rewritten Yes
Big Bang Yes No No, and makes debugging tough due to lack of understanding Yes, you need to rewrite the software if things go wrong
Agile No Yes Yes Yes

I will discuss them all in a good detail and share my recommendations/suggestions to you in their own chapters as we go deep in the learning process. The benefit of a software development lifecycle is that it helps us to,

  1. Better understand the flow of requirement understanding and software development
  2. What tests do we need to encounter and run on the software product
  3. Minimize the need to go back to the initial points and review the requirements
  4. Keep a good contact with the stakeholders, or customers to understand their needs
  5. Understand how a team should tackle the problems
  6. When a software product is ready to be deployed

Most of the times, software development teams need to document their product, so that end users can understand how to perform a specific task in their tool/product. An SDLC also takes this aspect into account to support the team in their entire development process, and enforces them to also document every feature, requirements and outputs.

Software development tools

Software development tools are used to develop the software, which aid the developers in their software development processes. These tools come in all shapes and sizes, depending on the software being built, the software development methodology and design being used — for instance, some tools support DevOps principles, and some do not — and they all help the software developer in their processes. A tool that helps the software developer in developing the software is called an Integrated development environment, or an IDE for short. The IDE takes care of most of the hard principles, processes, tasks and activities. Although the following list is not complete, but it is a concise list of what an IDE is expected to provide,

  1. Code editors
    • Where syntax highlighting and indentation come
    • Although none of these is required for code to compile, but it makes the code easier to read
  2. Framework libraries
    • The libraries, code compilers, services and dlls for the platform are known by-path by the IDE
  3. Code autocomplete
    • Just like code editing, autocomplete provides code suggestions as the developer types in
  4. Testing capabilities
    • Ability to tell the developer when a code is resilient against a wide range of input
  5. Compilation
    • IDE must include a compiler, interpreters, linkers and other code generation tools
  6. Debugers
    • Debuggers allow the developers to test their code and remove any errors by looking at their code execution/path.
    • Debuggers come with the framework/platform, and IDE supports the integration and allows developers to debug their code.
  7. Version control
    • Trust me, this is important and you must add version control to your source code as soon as possible.
    • IDEs support version controls such as git etc. out of box.
    • Specific IDEs target vendor-specific version control environments in a graphical format too,
      • Microsoft Visual Studio supports Visual Studio Team Services, but they also provide Git support, so does Android Studio and Eclipse etc. etc.

Long story short, the tool must provide and serve the developer with everything that he needs to use for the development. There are some tools that are specific to a category of software development, such as web development IDEs, which include Visual Studio Code, then there are enterprise grade software development tools that support development of web applications, or desktop applications such as NetBeans, Visual Studio etc. and then there are some tools that support mobile development, such as Android Studio. The thing is, there is a tool for everything and you have to decide which tool better serves you and your team for the development of the software product you are assigned to.

Desktop application development

Desktop application development is the most general and most widely used format of software development, in which you build a software application for a customer's computer device. Since the learning days of students, all the way to initial internship programs, everyone is taught to develop and test their software programs on the computer. This is one of the reasons why, desktop application development — be that as a terminal based application, a backend service, or a graphical application that provides a customer with a set of services that they can perform — is the form of development that everyone knows, and has tried once in their lives. Other formats of software development, the web, mobile, or cloud application development are more specific cases of development and require different approaches to be implemented.

There are various methodologies for development, deployment and maintaining a desktop application. Various frameworks are supported to be used for desktop application development, .NET framework for instance. NetBeans for instance supports GUI development with Java, through the platforms such as Java Swing or JavaFX etc that provide a wide variety and range of control over the development processes. Qt, is another framework that supports desktop development and they have their own IDE, Qt Creator. You can find an IDE for your own platform with a simple Google query.

Mobile application development

Mobile applications are compact applications, with less or similar features that are offered in a desktop application. I did emphasis and tried to do a lot, that the mobile in mobile application development is not the term to explain the Android or iOS or Windows Mobile development. Instead, it means anything, that can allow support and services to the users on-the-go. Mobile applications can be installed on mobile devices, that a user can take with them or when they are not in front of their desktop systems. Mobile devices can range from simple mobile phones, to smart watches, to holographic devices and tablets/phablets. The difficulty in the mobile development is the consideration of different hardware in mobile,

  1. Screen size
  2. Computation power
  3. Device platform
  4. Hardware components
    • GPS
    • Bluetooth
    • Fingerprint scanners for instance
  5. Marketplace subscriptions
  6. Audience
  7. Application type
  8. Security

And several other problems/considerations arise, that you must take into accountability and then start writing a software for mobile platform. As I have mentioned on the mobile application development category, there is another approach at writing mobile applications, which is progressive web apps, they are installable web apps with the meta information about the web app. It takes care of majority of these for you, and you write a single application: your web application.

The tools for mobile application development are also different, and sometimes expensive to purchase too. Mobile applications need to take into account the amount of computation that an application will consume, the amount of data it will present on the device screen, how large the elements would be and how the interaction would be — animations, transitions and much more. Several platforms, frameworks and IDEs are used by developers to develop their applications, each depending on the platform and the approach you are taking.

Aside from these, the debugging/testing and execution of a mobile application is also costly and expensive sometimes, because you need to purchase a specific device in order to run tests on it. There are some vendors out there who do support cloud-based testing, but that is also not an option to some.

Web application development

I have covered most of the web application development part in the link above, but I want to discuss the differences in the project type of a web application compared to those of the other types. The basic difference is the way users use your application. A web application is a network based application, where your users connect to your server to request resources, publish items (uploading) or capture the items for their own use (downloading). This requires that your software developers understand and take the network problems and features into account.

A web application can serve many benefits, and it can bring many problems to the software development team as well in that, it does not necessarily is a close-source application — remember those questions, how can I prevent user from having my HTML code? — and these are the problems that a developer/team must understand and take necessary steps to properly proceed. In a typical web application, you focus on the

  1. Document or resource itself
  2. Stylesheets to be applied
  3. Management of user interactions

You are provided with the control over all of them, and then you have to properly take care of them. Now think of the way a software development team would go about tackling them, in a typical software development team, there is a group of people building the software. However, in a web development path, there are multiple groups, each tackling their own problem,

  1. Frontend
  2. Backend

Then they tackle the problem at their own side, such as validation of user input, or authorization of data access, or even something more appropriate such as displaying a table of entries, or returning the data from the tables. Each have their own aspects and they continue to build their part of the web application and then integrate the parts, to generate a web application.

Best practices and more

Each of the design methodologies that we have talked about has its own benefits, and the degradation reasons, each of the development type requires a different approach based on several different factors and this is what makes software engineering a much wider topic in computer science because it is not just about compiling the source code, it is writing some sense in the code, and making it do what we want it to do, while taking care of the future needs and growth.

All of the specific development categories have their own need, and their own design practices and approaches which I will walk you through in the chapters.

DEVOPS

DevOps

DevOps is a mindset, philosophy and ideology for the development toolchains and processes that supports customer requirements, and faster product publishing.

ADL

Application Development Lifecycles

Application development lifecycle is the entire process of app development, from the inception of application all the way to development, management and updating.