 Welcome to this course on computer programming. In this session, we are going to introduce a new concept called software engineering. In programs that we write to make the computers work, the term software refers collectively to all such programs. Now, as the size of the software becomes large, we obviously need special methods to manage both the development of such large software and its usage. There is an important component of software that is called maintenance of software, we shall talk about it in a little while. In this and the following session, we shall be discussing concepts of software engineering to handle such large systems. In particular, in this session, we shall just look at some basic terms, particularly the categorization of software for different purposes. Very broadly, the software is categorized into four different categories. System software, application software, embedded software, which is essentially application software, which is embedded into some gadgets and appliances and it has some special features in that the system software and application software together need to go into the embedded systems. Last but not the least, web applications, which around these days, we shall comment on each one of these briefly. First, the system software. Whenever we use a general purpose computer, we need an operating system to manage the activities of that computer. An operating system is nothing but a specially written software, which manages the computer system. It comprises of several elements. It has, for example, facilities to manage the memory of the computer, facilities to manage the storage associated with the computer, facilities to manage the processing of various programs by the computer. You will be familiar with Microsoft Windows, for example, which is a popular operating system, Linux and its variants, another set of popular operating systems. Next, come under the system software, a set of compilers for different programming languages. These programming languages are referred to as third generation languages. The first generation programming was often done using machine language code directly 0111001, etcetera, etcetera. Then people developed what is called assembly language and the assemblers or compilers for those assembly languages. Assembly languages were called the second generation languages. The third generation languages started with the invention of Fortran or formula translation, a very popular language used in early days for numerical computing. There have been more than 800 higher level languages since then incidentally. Then came specification kind of languages, where you do not have to define what procedures to be followed, but just say what you want to get done. Databases and structured query language, which is used to program databases fall under this category. These are called fourth generation languages. Again, you would require system software, effectively equivalent of compilers and runtime software to handle programs written in SQL and such four years. We then have rapid application development tools. One example is an integrated development environment. Code blocks, for example, is a very simple, but still an integrated development environment. And there is lot of software, which actually has been written to make that code blocks available to us. There are several such integrated development environment, which make development of software easier. Then there are scripting languages and their interpreters such as HTML, JavaScript, XML, etcetera, etcetera. Tools to build software keep evolving and all such tools, which help us build other kind of software and those which manage the computer systems together are referred to as system software. While system software is the basis of everything that we do with computers, the main aim is to write programs, which will solve practical problems. Because these programs determine functionality needed by people, all such programs are collectively classified as application software. Some examples are accounting, payroll, inventory control. These are the traditional applications for which computers, by the way, were deployed from very early days. But larger software, such as software for operations of banks, often called the core banking software or software required to handle railway and airline reservation systems. For computational purposes, there are specialty software such as simulators, equation solvers, genomes sequencing for example, in life sciences. All these applications could become very large and very complex. Application software in general is characterized by large size, it has complex functions, it used by large number of people and it requires significant time and efforts. Application software, particularly for that kind of application, which is common and to be used by many organizations, you have package software. Some examples of package software for applications is ERP packages or enterprise resource planning packages. Some of you might have heard the name SAP for example, or there is an ERP package by a company called Oracle. These packages, while they solve a generic problem and is quite large, has many modules, but is often required to be customized for local requirements. Such customization often involves writing more programs or modifying some of the existing programs of such a package. As opposed to that, another set of application software could result from what we call a bespoke development. Bespoke development generally means developing the entire software from scratch, from first principles by looking at what is the functionality required. Whether it is a package software customized to the need or whether it is a bespoke development in general, application software is a large and complex system. Embedded system is another category, which is very peculiar because this defines software which goes inside any gadget or appliance. It is interesting that in modern days, almost all familiar gadgets such as washing machines or TV sets, even our digital watches, cameras, a lift for example, or larger systems like car and aircraft, all of them are driven by computers inside into the gadgets, kept inside the gadgets. Of course, each of these computers have specific functionality and this functionality is provided by the application software which is written for those computers which are embedded into such gadgets. Equipment in manufacturing plant is another example where you have embedded software. Medical instruments and equipment, in fact, practically every gadget that you can think of today has some kind of computer inside it and to make that computer work, you need to write some application software. The special characteristics of embedded software is that the core size has to be compact. So, unlike the programs which we write for example, when compiled and linked with the libraries often result in 2 or 4 million bytes of code which is to be executed then is not proper for a embedded system where the memory may be extremely limited. So, the code has to be written with very specific emphasis on its compactness. Further, the changes in the versions are difficult. Any other application software which we use from general purpose computers, we can simply load the next version and start using it. But imagine that there are a million watches containing certain piece of embedded software that has been distributed across the world. If you come up with the next version, how would you ever be able to reach every watch in the world and modify that software to the next version? In general, the changes in versions for embedded software are very difficult to almost unmanageable. Development cycle of embedded system is much longer. We finally, look at web applications. These are something which we are familiar with. In fact, the EDX system that we are using is actually a web application. This is the kind of applications software where as far as end users are concerned, they have a web interface. So, for example, I will open a browser and I will connect to that particular application. Of course, the application in turn will connect to one or more backend systems through network, often internet. These applications have become extremely popular with the advent and growth of internet first and then the web. These are often in the nature of distributed applications. To give you an example, suppose I want to reserve a ticket for a flight. I will go to the airline reservation site to book a ticket. This is my first application which I invoke. Once I am there and I select a ticket, I need to pay for it. So, I am guided by that site to payment system get way which actually is another application located on another server may be thousands of miles away. That payment system get way will get my collect my credentials and may in turn guide me to my bank or credit card system where I actually make the payment. Observe that after making the payment, I must be automatically guided back first to the payment system get way and then back to the airlines and internally all these three different applications must ensure that if the money is collected from me, then a ticket is issued to me or if for some reason money cannot be collected, then any ticket issued should be cancelled. These distributed applications are more difficult to develop naturally because these applications have to interact interface and interact with each other. In summary, we have studied categories of software. We understand that large coordinated efforts are required to both build and maintain such software. Thank you.