 Today is the concluding session. So what I propose to do is to do a very quick review of the course and then specifically discuss the end semester exam pattern which I had promised I will do in the last lecture and then of course I will have some few concluding remarks. So if you look at the whole course when we started in July we studied the basic principles of computer programming in this course. Fundamentally we looked at computer as a stored program machine and we said it has memory, it has processing power, it has peripheral devices and it has storage. We have learned to handle each of these bits in a limited fashion. We also discussed the development of programming paradigms, how people program machines using machine language earlier and then higher level languages developed. Primarily we have been discussing the third generation programming languages through CLC++. We learned the basic programming concepts. So data representation, values of different type. So we have types for example fundamental types such as integer, real, whatever, whatever. We considered variable as a placeholder for a data value. We looked at expression evaluation, order of evaluation, assignment of a new value to any variable placeholder. Then we discussed two very important concepts in procedural programming. Ordinarily a stored program would be executed sequentially. Each instruction after the previous instruction would be executed till all instructions are executed. We found out that that is not the best way to represent our program because during the program execution in our algorithm we might want to execute some other instructions based on certain conditions which develop during the program execution. For example, if an input value is greater than 25, we may want to execute some other instructions rather than the sequential instruction. It is in this context fairly simple but powerful programming constructs which are called the control structures. The conditional execution embodied by if, if and else, the simplest form, if, else, if, later. And we also said there is a statement called switch. There is a question mark expression. These are all methods of conditional execution. We considered iteration in fair amount of detail because we have to iterate around to get either past several elements of an array or to iterate around a single value to make it better and better and better in several numerical computation problems. In short, then we discussed the conditional execution and the iteration mechanism fairly in details. These constitute the basic programming concepts. These would be available in absolutely any programming language that you will ever study. We should never ever talk about knowing this programming language or that programming language because it doesn't make sense. There are more than 1,000 programming languages. Primarily there are three programming paradigms. The procedural programming which is the conditional programming embodied by programming languages such as FORTRAN, COBOL, C, Pascal, BASIC, whatever. Object-oriented programming which we have not studied in details but programming which is embodied in programming languages such as C++ or Java. These are actually called object-oriented programming languages. And we have a third paradigm called functional programming. Primarily we developed to deploy for building solutions such as in artificial intelligence problems. We have not studied that a paradigm at all. We have primarily studied procedural paradigm and we have very briefly introduced ourselves to objects. However, the fundamental procedural programming concept that we have studied will be there in absolutely every programming language. So you need to be familiar with the notion of the type of data, conversion of types, what is permitted, what is not permitted. Some programming languages are strongly typed such as C++. Some programming languages, particularly scripting languages are very weakly typed. We saw an example of AUK scripting language. Those of you are familiar with HTML which is another scripting language for example. Or JavaScript which is nothing to do with Java programming language although it is similar. These are called scripting languages which are interpreted rather than compiled. We saw that. We then specifically looked at the notion of process of compilation. We looked briefly at the operating system environment with which you are becoming familiar from lab one because that is what we have to use. Initially you perhaps had no idea of what are directories and sub directories and files and file permissions and whatever. But as you got used to using these environments, you learned more and more about. Very specifically we saw how a compiler produces object code. The various object codes can be linked together. We saw that for large software you would use necessarily some header files which are to be included for compilation. We also saw how libraries could be built, functional libraries specifically. And they could be linked together if they are previously compiled. Fascinating, building of large programs. Very specifically we learned that in our endeavours to build solutions, programming solutions to problems, it is stupid to start always from scratch and write and develop the entire programming system from scratch. Why? Because many aspects of the programming which are required to solve any one problem could already have been covered in building solutions to some other problems. And the reusability of already written code or essentially saying do not rediscover the wheel is a paramount objective of every program. Consequently we learned how we could use already built libraries or functions or already built programming systems and construct something more which is required particularly to solve a specific problem. Mishit or enhance an existing system with these and that is how you build solutions there. Amongst data structures we had time to discuss only arrays, one-dimensional, multi-dimensional arrays and structs which are complex objects. We did not see additional artifacts that are built or that are defined using programming language facilities that we have. We did notice that we could define an equivalent of a type when we define a structure, for example we were effectively defining a new type. However, definition of an abstract data type and the features to do so and features to use those abstract data types is not limited to simple things like structure and arrays. We have specifically not discussed interesting types such as link list, queues, trees and so on. There are courses on data structures and algorithms, advanced courses which computer science students will necessarily do. And others who are to practice programming in their own profession will learn on their own. But these are very useful concepts where you extend the notion of a simple data type by including additional types. In fact we object oriented programming whenever you define an object class and whenever you define methods or what we call member functions in C++ you are essentially extending the reach of a programming language which defines certain basic data types but extended or abstract data types can be continued to be defined and you can actually use conventional operators to perform operations which are not conveyed automatically by the nature of the app. For example, plus is an addition operator but when we use it in the context of strings which are members of stream class in C++ plus stands for concatenation. Exactly the same way multiple operators can be overloaded in object oriented parallel which we have not discussed in greater details but we did discuss functions and function calls which are fundamental to programming language and reusability. We discussed some applications, we discussed some computational applications such as matrix multiplication, a larger application for image analysis we in fact had a project but that we will discuss in the next slide. As I mentioned earlier I repeat that we are not explicitly studied linkedless queues, stacks, search trees and these are extremely elegant and important data structures. Primarily on one hand they facilitate easier programming using those particular data structures solving larger complex problems and within these types there are some very elegant algorithms which significantly reduce the computational time. Remember we discussed the computational efficiency coming to the actual use of complete programming in the world. We remarked that very rarely we would be writing 100, 200, 300 line programs to solve a real life problem. Even a trivial application would demand everywhere between 5,000, 10,000 lines of code to be written. The larger and more complex problems of course could extend up to millions of lines of code. Very clearly it is impossible that such software development could ever be undertaken and completed by one individual. Of course there are very creative individuals who contribute to the design of the whole software. They contribute to some very elegant algorithms in some part of it but essentially large software development is a team effort. To get a flower, first hand flower of what large application development is we introduce course projects which is what we have been doing for last one month so that you can understand and practice such development process at least to some extent. I think by now you would have concluded and you would have observed that when large groups and they are not even large groups really, 20, 30 students working in a group, you will find that a large amount of time is spent in coordinating activities in job allocation, in managing synchronization because somebody's activity depends upon somebody else's activity and so on. This is the reason why a group activity is so significantly different from an individual activity. So remember that in future whenever you use complete programming to solve large problems, you will have to depend upon group members. Not all of them will be in sync with your own thought process. This time you have the flexibility to choose members of your own type because they were all CS1 students. In real life, if you are a chemical engineer or mechanical engineer, you might have to work with some team members who are neither that, they may be accountants for example. They may be just good programmers since a programming parallel. As a result it is important to note that group work for software development is going to be the major mechanism of developing solutions to large problems. We also studied some elementary mention of complexity of algorithms. Complexity of algorithms is a topic in its own right and there are full semester courses on analysis of algorithms. What we did is we tried to understand what program execution efficiency could mean, why it is important because it does not matter when a program executes in let's say 0.8 seconds, then to make it more efficient to execute in 0.0 seconds may not be very meaningful because less than 1 second is good enough for me for example. But when you have very large and complex programs and when multiple of such programs are to learn, time complexity becomes extremely important. We had a flavor of that when we discussed some preliminary aspects of algorithm efficiency or time complexity. By and large we have used C and C++ programming languages to discuss our programming concepts here. I will repeat once again that C and C++ are incidental. We could have used for example Fortran programming language or even Komal programming language to understand programming paradigms of the procedural type. We could have discussed Java for example. The point I am making again is that C and C++ are incidental and therefore unlike in most major universities in the country, you will not find the name of the programming language as part of the title of the subject. The subject is computer programming and utilization. And what you have learnt hopefully are fundamental programming concepts with a very brief introduction to object oriented paradigm. But you can build all this and you can learn other programming languages on your own that is the hope. So while we have a brief introduction to objects, it is expected that when you study your things further, either on your own or do specific advanced courses, you should be able to cope up with practically any programming paradigm. To the end I will discuss what kind of programming challenges you are likely to face when you build solutions to more complex problems in this world. But this is essentially what we have done in this course. Now as I promised, I will very briefly describe the end semester examination. I hope all of you are aware of this, the exam is scheduled on Monday 23rd November from 9.30 to 12.30. We will have a sitting arrangement which will be very similar to mid semester sitting arrangement. So we will have the exam in Convocation Hall plus IC rooms plus main building. All of you remember how you start for the mid semester examination? Exactly in the same way we will have allocation, some I think groups up to 7 or here or whatever I don't remember exactly. If there is any change or even if there is no change, the schedule of sitting arrangement will be again put up on the notices and please look for those notices but by and large we shall follow the mid semester exam pattern. Sayobas for the exam. Orally the sayobas for the exam is all that we have discussed in the course and much that we have not discussed in the course. We will follow the same pattern. So the following sayobas is everything that we have covered in lectures in labs except the specific work that you have done in the projects. You will recall that I had arranged some special lectures by external experts and by myself where only the team leaders were invited because specific topics were discussed. Now that specific discussion is outside the scope of the exam. The exam is for all and therefore the material that we have covered in the lectures is what will be the sayobas. However our image analysis for example I propose to give at least a question on some aspect of image handling but purely based on what was discussed in the regular lectures. So nothing outside the regular lectures will be in the syllabus formally. However as I told you in the mid sem, I am repeating this again in the end sem, there will be at least one question about which no student in the class will have any inkling. So there will be one question outside the syllabus and that question will expect you to externally imagine whatever you have studied to apply your mind to solve that problem. Even though the question paper pattern is slightly different in the mid sem you wrote the answers on the same question paper. We found out that the logistics in arranging to Xerox multiple copies and staple them was horrendously complicated and we could not, we could just manage to complete it about one hour before the exam began. That is no more feasible for the end sem where we will have six questions Xero4, we will say three of our exams. So what we have decided is that we will have question papers separately and answer books separately. That is how I suppose you write most of your exams. So you have got eight page answer books or sixteen page answer books. Sixteen page answer books and you will have of course ample supply of supplements and whatever but you will have to tie those supplements and please remember that if you use separate notebooks the top right hand corners of the first page must be your roll number and lab batch number otherwise it will be very difficult to identify in case you goof up. So if you have multiple answer sheets which you tie up together even if you tie them here on each separate answer sheet do not forget to write your roll number because unlike in the earlier exams where we will ample opportunity to discover things, find out, etcetera, etcetera at the 8th sem we will know about opportunity. The examinations will be open notes as in the mid sem. There will be six questions some will be multiple parts. I would try to organize the question papers such that the difficulty level of the questions increases as you go forward however that is not absolutely necessary because I will also have to organize questions roughly on the lines of the material that was developed and discussed. So I will see how exactly you will do that but I will try to organize questions in ascending order of difficulty. Last time there was a genuine observation made by many students that there were some questions which have let's say whatever 5 marks which were extremely simple and there are some questions which are 5 marks which are extremely difficult so is that justified? My answer is yes it is justified the question paper is meant for all students the students who are not very good in programming must also feel comfortable about scoring mainly marks to get their passing grade as good a grade as they can and therefore there must be some simple questions which might earn them maybe 5 marks do not forget that I am a travel programmer and I have been programming for 3 years in my school I can solve that simple problem in 5 minutes but on the other hand whenever I see the computer in my life I may take 20 minutes to solve the same problem I solve it correctly but I need 20 minutes and therefore 5 marks are justified for me to earn from that question while some of you might feel it is too simple a question so this will happen again do not lose your lives for some questions for even to get 5 marks you might have to struggle for half an hour for some questions you might be able to get that in 5 minutes that is that part and part of your life but I will try to arrange questions in ascending out of complexity to the extent that is possible some questions will have multiple parts maybe one or two questions will have a simple thing now here is the important part we used to have I have put quote-unquote discussion session you guys usually call it creep sessions right so if you do get marks that you deserve after you get the corrected paper you find out that some algorithm has not been understood by that EA who corrected that paper and so on you have a chance to go back argue convince and I notice that in some cases marks have been increased in fact I had couple of very specific requests that look with me always it happens that my algorithm is not understood by anybody who examines it not necessarily this year but everywhere so what do I do with it my answer to that is changing the evaluation pattern completely at the back end what we did in the mid-sem was the question papers were by large corrected by the lab group TS so consequently what happened is that four or five people who are sitting together in one group all were correcting different questions and as a result there was no discussion possible so question 2A for example was corrected for lab batch for lab batch 9B by somebody else sitting somewhere else this time I modified and using what I call the pipeline motion of paper correction we will completely give away or throw away the motion of lab batch correcting their own papers instead we will find out how many parts are there in these six questions maybe there are 15 parts ABC whatever whatever now we create 15 groups of TS each group will be correcting only one part so four TS sitting together may be correcting question 1A next four TS sitting together may be correcting question 1B next four 1C some other group of four students will be correcting question 5A and so on that way these four students who correct a specific question will be discussing amongst themselves constantly if they come across an algorithm which one of them cannot understand they can immediately ask the neighbor to check it and there will be specific instructions that for particularly for complex problems if the solution is not easily understood by one TA he should have given marks or two marks of whatever arbitrarily he should consult another TA I should be personally present and in addition to all of this there should be a moderation which shall be done by senior TAS here by and large therefore I expect for greater uniformity in evaluation of questions here this should take care of most of your apprehensions however even afterwards when the marks are declared and apart from the grades while we put up also the marks that individual students have got because after an incident marks should be completely available and there is no reason why somebody asks whether ancient papers are confidential or something like that that is nonsense as I said earlier I used to figure out correcting final exam question papers in front of the students we don't have that luxury now because the number of students are large and the exam is towards the end the paper collection specifically will happen only after my TAS have completed their exams don't forget they are also master students so we will not have any time for discussion session now however please note the last point if any student has ever come here or how much an application can be made for re-evaluation we will organize all question papers in assuming all the world numbers so that academic office will find it easy to extract a particular question paper for anyone who genuinely believes that he or she has got less marks than what he or she deserve we will get that question paper and we will not just re-total or re-check whether all questions are corrected or not but we will actually re-examine for that purpose we will record which TA corrected which question so we will know exactly and the TAS they are also going to be there next semester so those few students who still have a problem with their final exam marks can actually make an application formally there is a procedure in the academic office and we will have this discussion later any questions on this and same organization etc etc so I take it that this is perfectly alright so to recapitulate the sitting arrangements will be more or less same as the mid-sem sitting arrangements the academic office is just about to confirm that it will be a nothing notes exam like last night no books are permitted but you can have copies of whatever matter has been distributed in the class and labs and of course I will bound notebooks or files no newspapers will be permitted I will use a few minutes to discuss the future for all of you by then again there is much more to complete programming than whatever we have discussed in this course what we have done is nearly scratching the surface it is truly an introduction what we have attempted in the typical IIT style of course is that we try to take you as forward in the long journey as much as is possible notice that the kind of programming projects that you have attempted this is generally not done in most of the institution but actually have exposure to what last software is but considering that use of computers is increasing very rapidly what you are studying will only be a preliminary thing to real world problems and their solutions take for example conventional computers what you have seen mostly are PCs and you know that there is a server at the back end to which most of your PCs are connected but if you consider last transaction in system of bank account holders for example continue their credit transactions if you take state bank of India which has 16,000 branches and may be 25,000 ATMs the transactions are happening every time of the day some people are withdrawing money some people are putting money in depositing money some people are transferring money much of these transactions now happen on web consequently the requirement of large servers at the back end is the requirement so the kind of computers that you have seen both PCs and servers are no much for very large servers that you have which pose additional management problems of their own distributed applications we have very briefly mentioned I think that if I do an online reservation then what I get on my screen is a front end program which somebody has written on a web page I have failed my application on various computers from there if the reservation is available I will be directed to a towing gateway which will take me to a server on my bank's computer now these are called distributed transactions before because different parts of the activity are done in different computer systems different computer systems belong to different organizations all together unless I pay for my credit card to state bank of India or bank of the whole city bank and unless that payment is confirmed the Indian way is server by them I cannot get my booking but all of that can actually be handled today consequently the complexity of the programming system which drive these applications has increased in on us how I am computing in analysis is going more rapidly than what we can think how we could do floating point computations matrix inversions on small machines now you are super computers I don't know that I mentioned it whether you are aware of it or not but every year I mean in fact 6 monthly there is a competition of both large computers high-end computers which do high-end computing in analytics last year around this time I think an Indian computer called RECA made by Tata Research Labs actually performed fourth best in the top 100 of the world's fastest super computers so we have come a long way but the world is going faster and faster these super computers are nothing but a combination of large number of processors which are doing things parallely doing the same problem parallely is far more difficult programming wise then having 20 computers parallely executing 20 different things that is much easier to manage because each computer is doing some other program the same computer program to be executed by multiple computers is not an easy job and that is why high-end computing and analysis is of a different kind information repositories are coming in now you will have seen digital libraries where you can download books you can download movies you can watch movies, you can paper movie you have fingerprint collection system you have sensors data huge back-end servers far less are required not just individual servers the stories that we talk in terms of 100 gigabytes 200 gigabytes of this can you think that's a large storage that is peanuts when you consider typical data bytes of data warehouses and data bytes of storage farms which are now very common across the globe few in number but they are very common and this will only grow in future so whatever programming you have learned you have to increasingly apply it to solve larger and more complex problems of this type this is one end but there is another end where computers are being deployed in greater numbers and these are in the form of embedded systems you have seen a demonstration of a quicker a quicker has a processor inside which is almost as powerful as the processor on your PC it has additional signal processing capabilities so that it can handle radio packets transmit radio packets, receive radio packets practically every appliance that you see today in modern world has some kind of computer or the other and you have to write programs for that computer and the programming principles don't change the only difference is after you compile that program you don't load it from a desk but you load it permanently on a non-reliable memory inside the appliance so if you have a washing machine that gives you that to your house it actually has a computer which contains a program it has been tested rigorously and it has been put permanently inside that consequently when you operate a modern washing machine the computer takes over sensors from all the sensors you have activate motors and model so if you take any modern equipment for example a car or a ship or a rocket there is a large number of computers embedded and writing program for those embedded systems has become a very very major challenge manufacturing processes mobile phones personal digital assistants these all have very complex software if you take any mobile phone that you use the internal software that a mobile phone today has rivals the complexity of a full-fledged operating system and application software millions of lines of codes are written actually before they are squeezed into the small, non-reliable memory that you have on these gadgets and you can imagine since you have done a lot of programming yourself how long it takes to guarantee that your program works correctly how many times you compile how many times you modify and when you submit your assignment you are still not sure whether your program will work under all circumstances if somebody gives you wrong data whether your program will work or crash is not wrong appliances on the other hand have to guarantee that they must always work they must give a reasonable response when wrong data is given like if you key in a wrong telephone when your mobile phone should say phone number is not correct or something imagine if the mobile phones operating system was to crash every time somebody entered a wrong mobile you have huge problem so the appliances and embedded systems therefore pose an entirely different kind of challenge complex software will have to be written I am sure some of you have contributed to such development making these appliances better more comfortable and convenient to use even at children the software complexity continues to grow maintaining already written software maintenance is not in the form of like you maintain a bicycle by holding it every now and then maintenance of software development is actually extending the existing software new functionality is required new modules are to be added so maintenance is a wrong word only got stuck with the software business it is actually not maintenance but extension of software and that is perpetually required till the extended software becomes unmanageable you throw it out and start a new software development project effectively the life of a software really good non-trivial software is considered 15 years class it must survive for 15 years of maintenance and consequently software engineering has evolved as a major branch of engineering just like mechanical engineering electrical engineering and they are not programming software engineering for example emphatically raise down methods of developing projects in groups how group communication should be established how group hierarchy should be established how testing should be done there is a huge amount of research and just testing white box testing, black box testing the literature is about fortunately due to the internet you will be able to get very concise but correct introduction to most of these topics you just have to go to Wikipedia and find out what these things are it will be very interesting reading even in the story book reading but subsequent when you go ahead you will in your own fields when you use computers you will need to understand some of these things as well as you can so that you can produce absolutely top quality professional great software in whatever endeavors that you do so this is my concluding slide I believe you all know how adequate exposure to learn more on programming on your own and use the knowledge in your own fields and please understand one thing traditionally computer programming was considered to be computer science students preserve earlier it was electrical engineering preserve that is the biggest nonsense in math every individual scientist and engineer is required to be a good programmer to be effective in one's own field that's the reason why this course is compulsory practically for all human science students I believe now you have enough exposure so that you can learn things on your own if you know about the course as an engineer I hope you have enjoyed it for me it was really a great experience I had taught programming earlier but for 25 years I had not taught it almost all the things that I like is the level of enthusiasm and energy although the students were slightly worried and concerned at the beginning particularly those who came without any background but I am happy that everybody picked up no simple thing I like is that when I noticed some unethical behavior and I mentioned that I am not happy with it all students came up believe me in the history of teaching anywhere in this country I have not seen about 90 people confessing that they made a mistake and they were willing to correct themselves and thankfully to you and I it has been really a privilege to have all of you as my students so best wishes for the exam and best wishes for very effective use of computers in your own fields thank you so much