First off let’s define a definition for software. In all simplicity, it is a set of instructions given to a computer by which the computer knows what to do. But what does that mean? Let’s take a brief trip down history so we can figure out how we got to this definition. In the very olden days of helping people with calculations and computing, everything was in hardware. Hardware meaning: physical tangible forms. Which one is manipulated directly with some physical medium, typically hands. These tools were used to help with long calculations. One famous example of this is the abacus. A tool designed to keep track of calculations and by giving different values to different rows you could keep track of larger more complex sub-totals. Or keep track of variable results you needed for longer algorithms. So, fast forwarding to the twentieth century. General-purpose computing machines, now commonly known as computers, were conceived. The general purpose machines were indeed powerful as one could feed it a set of input data alongside instructions on how the input should be treated to get the output calculation. In the previous short story the physical device, the abacus or the computer, is what we’d generally refer to as hardware. Now software is the set of instructions given to the computer, so the hardware, according to which the input data is processed and some data is given out as the output. For the abacus, there was no means of giving instructions on how the abacus should handle the calculations as it was all powered by a physical interaction from a human being. It was powered by the muscles. The hands. Something had to move the beads on the rows. For the computer, however, we can give instructions. So we can create the software. For now, in the computer’s case, it is powered by electricity, and the behavior of how the electricity flows and moves things around is controlled by the circuitry on board. With electricity powering it up it doesn’t require the energy coming from a human to move things along. So you can make the computer do the calculations for you as it’s powered by something other than the person operating it. And this set of instructions that are given to the computer for the calculations is what is called software. With the definition of software established let’s have a look at what is a software developer. A software developer is someone who knows how to tell a computer what it needs to do using a language the computer understands. Now, these languages that a computer understands are known as programming languages. As the computer is not a living being with its own freely developing intelligence it does not understand natural languages or other means of communication. They can certainly mimic natural languages, but that is due to software created by some software developers using a programming language. As mentioned in the course introduction video, there are hundreds of programming languages in the world. So the choice of the language to create software is defined either by technical limitations or if very few such limitations exist for the environment you are working in simply personal preference. Now moving on to the title of the lecture. What is software development? Software development is the practice and process of developing software. In this context developing covers the following core elements: Creating Maintaining and Upgrading the software. Next, we’ll go through each of these core elements to understand what they are and what differentiates them. Creating software. This always starts with some sort of initial idea of what the software will solve. And from there it is a short way to figure out the first core feature or set of features the software will have. With the core features more or less decided upon we then move to the next phase which is designing, planning, and researching. Now, this phase covers several other distinct phases which I’ll go through next. So… Things that belong to designing, planning, and researching are The software’s architecture and technology stack. Proof of concept testing for the various smaller solutions that build towards the larger software. Evaluation of completed parts.
Do they make sense?
Are they working as expected? And how is it affecting the architecture and technology stack of the software? Implementing the development workflow from ideas to testing. Before you can get products you need to conduct your research and some plans on how to get the features built in one at a time. A workflow simplifies the process of getting ideas into implementations. This isn’t a thing to be intimidated by. Most of the time this happens on its own while testing things out and working on a proof-of-concept piece of software. But it is good to be aware of this as in large software projects with multiple people working on the same piece of software the conscious awareness of a united workflow simplifies communication and makes it easier for new developers to join in the project at a later date. Next. How to install and distribute the finished software. Ideas and plans for this should be done fairly early on as software without means of installing or distributing won’t be of any help to anything. This is often also the bare minimum amount of documentation that is created for the software. Although it would be nice if more documentation existed, usually at least this part is covered in the documentation. So. How do you get it installed? Typically that is always remembered. This designing, planning, and researching phase is easily very time-consuming. Especially so if you are working on a solution to which you have no reference examples that would help you to find a nice angle to the solution. The more you need to create from scratch the longer this usually takes as it requires more time in research and proof of concept testing. Take the next words from an experienced software developer: Do not skip the above. If skipped it generally leads to poorly functioning or maintainable software. The more designing happening on the fly where ever the cursor landed the more messy, tangled up, and unstable the software. Imagine building a car while skipping the above phases. Wouldn’t be a safe car now, would it? The same applies to software. Although the software is much more forgiving in the ways you can fix it up afterward when compared to hardware, such as the given car example, a car being hardware, it is still not safe from it. And over time the complexity increases so much that it might suddenly be easier to start the whole thing from scratch. After designing, planning, and researching there is of course the main grunt of the process. Programming. Programming also happens in the previous phase when things are tested out and proof of concepts is created, but the programming I’m referring to here is the programming of the final product where all pieces come together. Packaging. A ready-made piece of software should be packaged together so that all the necessary parts needed to get it up and running are known and can be found. Just like you need to package the pieces of furniture you buy in small pieces and they are packed in cardboard boxes you also need to package software. This leads us to the last part: distribution. You need packaging to distribute. Just like in the analogy to the build-it-yourself furniture you need packaging so you can distribute the furniture that someone will then unpack from the cardboard box and start building it. So with software, you need to pack it so you can distribute it so that someone can then install it and then start using it. And a few more words without bullet points. This creation phase is also typically referred to as development as the software is under development. Confusing? Nah? Maybe? But don’t worry about it. It still makes sense even though the broader concept of software development has more than just this phase. But just remember when software is under development or being developed something is being created for it or it is being created from scratch. Now. The second element of software development. Maintaining software. Working software usually requires some amount of maintenance. This of course greatly varies between software as some are simple task executions and others complex systems with multiple features. But some level of maintenance typically exists. On a general level, the more widespread the use of a particular software is the more maintenance it receives. This is because the software gets exposed to more people and more environments which brings out new ways in which could be used and shouldn’t be used. There is more than just one way in which you can use a hammer to hit nails and more than just the application of hitting nails to which you can use a hammer. The same applies to software. The more widespread its use the more things the software is exposed to and thus receives a variety of feedback. Someone might love it. Some just like it. Someone has no clue whatsoever. And with new people and environments using the software new bugs may also be discovered. Maintaining software means keeping it up to date with changes in operating systems and possibly some third-party software it is relying on. Quite obviously it also includes fixing bugs that went unnoticed during the development of the software. One thing that is not always given enough attention is the monitoring of software. Many things affect the performance and functionality of the software. Monitoring its performance and behavior during its time of active service is also a part of maintaining software. This is unfortunately neglected in many cases and it is also hard to implement. Someone or something has to use the software for it to be possible to monitor. And how do you monitor it and what means and ends is also something that needs to be taken into account separately? If this was software as a service piece of software, so like a web service someone uses, then you probably have a lot of monitoring for the environment in which it’s running. For network calls. Things like this. And you’ll maybe have some logging system as well. But then if this was just a piece of software installed on a desktop computer and it doesn’t do any network calls, it’s just a stand-alone piece of software, then most likely you’ll be implementing only a logging solution that logs certain levels of events to a file and retains them for a certain period. You could of course implement some sort of graphical output as well for performance if you wanted to. But that depends on the type of software you’re creating if it makes sense for the user to be able to monitor its performance as it’s working. But if there is no monitoring it is a guessing game of various tools, battles, and luck to get well-working software created. With monitoring, it is easier to see what’s going on. Thus making it easier to hit targets and results in well-functioning software. Easier to notice regression in the software. Seeing if something unexpected affects its performance and maybe create a fix for it before it completely crashes. And other things like this. And finally the last core element in software development. Upgrading software. This is something that could be argued to be a part of maintaining software, but there is a distinction between them. In maintaining the core features of the software are not changed. Only fixes and small improvements to the core features are done. Upgrading happens when something new is created to existing software. In other words when a feature changes considerably in behavior or performance or when new features are brought into the software. So in short. Upgrading means new features or drastic performance improvements. And maintaining fixing and keeping it working. The process of upgrading is very similar to that of creating it. It involves the same phases. Only it starts by building on software that already exists. The upgrading of software requires the same initial phases as in creating. You need the idea of something that needs to be done. You decide upon what the features should be. How they should be improved. What are the features of the upgrade? And then they’ll need to design, plan, and research just as in the creation part. And it may include considerable amounts of programming for the upgrade to be completed. It all depends on how big the changes you’re going to make. So just like software is under development when it is first created so are upgrades under development when they are being created. Now coming toward the end. I know there has been quite a lot to consume so far. But I still want to leave a picture, an image, of what a software life cycle looks like. So what you first have is you have the idea then you go on to designing you have some proof of concept testing actual programming then building the software, getting it ready for packaging. Then after that, you have the installable software. Then you distribute it. Or you don’t use it yourself. But then you have happy users. Hopefully happy users. And then from this, you get the feedback loop and new ideas of how it could be improved would be cool if it could do this and this, and so the cycle begins again. If the cycle is broken from any of these parts then the software stays in whatever state it happened to be in when the cycle broke. If the cycle breaks the software stops improving as no new ideas come in or no one designs what should be done no one does any testing for the new features that were requested or there is no one to program or then the system that’s used to build the ready-made software breaks or doesn’t exist no ones figured out how to package it or has the time to package it or then can’t just distribute the ready-made software for one reason or another. If any part of this chain breaks then the life cycle of the software stops and it just stays in whatever state it happened to be in. And software development is also so much more than what we’ve covered here. So far, in the lecture, we’ve just covered the tip of the iceberg known as software development. The definitions and explanations of the three abstracted elements of creating, maintaining, and upgrading software are just the beginning of understanding and knowing what software development truly contains within itself. And the rest is all best learned by starting to develop software.