 So, it is a pleasure to be here and I guess I am also a little bit nervous because all of you have been teaching courses like this and it is not at all clear to me that I necessarily have something to really tell you and it is also it is also clear to me that the situation in which we find ourselves could be different for every one of us. So, what so the student body that I get in get here and the student body that you get in your colleges and various other situations might be quite different. So, please take whatever I say with a pinch of salt. It does not mean that I am not be I am not sincere about what I have been saying what I will say. I have done some amount of thinking about it and I will say everything quite sincerely except that whether it applies to you or whether you should consider it to be good enough for imbibing as Professor Fadaksov flowerally put it is not clear to me. All right. So, yeah. So, this is the background. This is really going to be my experience in teaching this course and yeah. So, some details as Professor Fadakus perhaps told you this course gets taught over here with a very large class and the class has a wide range of preparation. So, some students come in with substantial computing computer programming knowledge some come in completely cold. So, it is a bit of a challenge to make sure that everybody remains engaged in class. There is a lot of management related work to be done. There are some 60 odd teaching assistants and strange as it may seem although this is a very elementary course in some ways I have not been able to find a really good textbook for C plus plus. I do not know what your experience is. You will see what I mean by good or what my version of good means in a few minutes. So, for something like that I have not really been able to find a good textbook and that creates a major problem. This talk is going to be focused mostly on what I think is think should be the correct content. There is a lot of management needed when you deal with 60 TAs and 700 students and as Professor Fadakus himself doing right now with some 900 students or at least 850 students and an even larger group of TAs. So, that really takes a lot more energy, but I will focus on the content and the delivery aspects. Here is going to be a rough sketch of my talk. I am going to say something about what I think the new student is. I think it is important to think about whatever students want from education. I feel that learning should be fun, it should be well motivated. So, it is not that we want to teach something to students, we want some material that we want to convey, but it really should be that the students want to do that. So, perhaps the first thing that we need to do is to create the motivation in them. Then I will talk about some of the course themes. Graphics turned out to be a rather major part of this course and I will tell you why in a minute. One of the important ideas that I have followed in every lecture was that a lecture should not be about the language. It should not say that today I am going to teach you this. Instead, every lecture should begin with a problem. So, it should be oriented towards problem solving. So, that itself provides the motivation which is extremely necessary. A lot of our education has this notion that in the elementary courses, it is okay to do things superficially. I do not think that works at all. So, if you do something superficially, then that means you do a lot of things. If you do a lot of things, it is just a lot of disconnected information. That is not easy to learn or that is not at all fun to learn. So, I think that a certain amount of depth is very much necessary. Depth actually encourages even learning simple concepts. So, that is certainly a very substantial theme in the course. It is said often that learning in an isolated manner is no learning at all. What you learn has to get connected to things that you knew before, things that you are likely to know in the future, things that you are learning side by side. As you learn this, you are learning several other subjects. So, if you can connect up whatever you are learning to all of those things, that is really very, very valuable. That makes learning quite easy. This course is about programming. It is about computer science in some sense and cool algorithms. Algorithms that are clever or do interesting things are extremely important. If you do not have those, then the course will sort of be very, very humdrum, very monotonous. So, here is my take on what this new student is. So, 20 years ago or well, if I should be honest and say 30 or even longer ago, when I was a student, we were a lot more reverent. We were a lot more respectful of our teachers. We would take what teachers said with a lot of belief as compared to the students today. The students today, somehow are very skeptical. They do not want to necessarily do the things that you ask them to do. So, this is a major problem. There is also a problem on sort of the parental side, if you will, or the social side, that somehow there is our whole society has gotten to this careeristic mode in which everybody is sort of really expecting students to do very well, to work very hard and often to work very hard, even if they might not want to. So, I would really think of the students as being somewhat oppressed and they have worked hard, they have come into IIT and somehow they feel that they should get something really new, some more freedom. They should be treated more seriously or wherever they go into college, there is a feeling that they should, that they are now adults, they should be taken more seriously. This is extremely important. I think our entire school education never really says why we are learning whatever we are learning and that is probably a major explanation of why a large number of students do very poorly in mathematics. They never figure out why mathematics ought to be learned. What is the interesting thing about it? The other is to tell them. So, on the other hand, if you tell them what they tell them why they should be learned, I think it makes a major difference. Then they are on your side. If they do not know why they are learning this, then you are on one side, the students are on the other side. Otherwise, they are on your side now and it is important to get them on your side. Of course, there are lots of video games and so the students have many distractions. There are lots of things going on. So, the entertainment world, the sports world, everything is a demand on the students' time. Of course, many things also create this idea that I want to do this, but I want the payoff now. So, I want instant gratification. So, I expect that everybody has their opinions on this and not that this is very original or anything like that, but I think this is important when we plan out a course or when we plan to teach. Again, I am sorry if I am harping on this, but I find this to be a really big problem at every level in education. So, I feel that we try to tell the students that this is worth learning. You should learn this, but the student really does not care. So, what we should really instead try and figure out is, what is it that the student wants to learn? If we could figure that out, if the students, if the questions, if the subjects become the ownership of the student, then we will have accomplished something major. We will, as I said, the students will become our partners. So, the student must develop an ownership of the questions being answered in the course. It should be their questions and topics must be fun. I mean, if you, if the course is not fun, especially if it can be fun, then I think, no, no, you have to reorganize. There is also always this discussion as to whether we should do, whether we should be talking about beauty, teach something that is beautiful or teach something that is useful. Sorry, you should teach both. So, there is no or here. You have to do both. I will get to sort of some core ideas which perhaps people are getting impatient for just hear me out a little bit. So, I want to talk about fun, because I think it is really important in education. And just to set the stage. So, here are various kinds of fun things that children and even adults do. Say, for example, eating ice cream or gulab jamun or whatever is your favorite meal. Climbing mountains, swimming or learning sports. Say, for example, if you tell students that I am going to teach you how to play tennis, you would get a lot more attention perhaps. So, there is certain, certainly something really fun about playing the sport, though not necessarily it is the case that it is easier. So, fun is important. Seeing a movie or a natural panorama, a magic show, all of these things are really important. And I feel that when we talk about learning, we should have analogs of these things. Well, forget eating ice cream. So, that is, leave that alone. But the other things, we should have an analog of. So, you should feel that there is some magic that you are learning. There is something really magical that you have learned. You should be able to see a grand vista, the kind of vista that you see after climbing a mountain. You should be able to see that after you have gone through a course. And there are lots of things. If you are playing a sport or swimming, you have to have strategies, all of these things should find some analog. And actually, they do have an analog in most kinds of learning. I think it is important that we bring that out. Related to programming, I think there is an obvious sense of accomplishment that students can have. So, at the end of it, the outcome should be that the students should be able to write programs, programs that they would want to write. So, there are two things involved over here. So, the course should really do two things. They should teach them how to program, but they should also teach them what are the kinds of things that they might want to solve using programming. So, it should relate to their experience. So, it should not be something that they do in the classroom and forget. In their day to day life, if they see something where programming is important, it should strike them that I can write a program and I can solve this problem. Or if they feel that for fun, they want to write a certain program, they should be wanting to do that. Computer science is not an isolated science. So, whatever programming you do should relate to other sciences as well. Actually, why is a science? It should relate to all of life. It should perhaps relate to literature or poetry, whatever. I mean, you have to use your imagination to relate it. Finally, there have to be moments in the course when the student says wow. So, this is something really cool. This is something I did not expect. This is something really pretty. This is something really powerful. So, these wow moments must be there. So, now to some brass tacks. So, these are themes that I am going to mention and these were ideas. So, these were strategies I used to bring about some of the, to accomplish some of the goals that I have sort of hinted at earlier. So, one major theme was graphics. So, one major theme of the course was graphics. How many people over here have seen this programming language called logo? Very few. I am very surprised. Actually, these days, logo gets taught in schools as well. So, let me tell you what this logo language is. So, a logo is a language in which you are given, you are given a screen on which there is a small, a small sprite, a small gadget which is called a turtle. And you write a program which just drives around that turtle. So, you say forward 10, then that small thing on the screen moves forward by 10 units. You say turn right 90, then it turns right 90 degrees. But as it does that, as it does all these things, it has a pen with it. So, if the pen is down and you ask it to move, then it will draw a line on the screen. So, the idea now is, the idea of this language now is that you are going to draw interesting pictures using this turtle. Are there really that many interesting pictures to be drawn? Lots. So, starting from say basic polygons, you can draw, you can let your imagination really lose and draw very interesting things. So, there are pictures in which there is, so there are pictures in which there are repeated patterns. There are pictures in which there are recursive patterns. And so, all the programming language constructs or a major program, major set of programming language constructs will get exercised when you try to draw these patterns. So, what I did was, we had a TA who built up a logo like system in C plus plus. So, students were able to use that system to draw interesting pictures. And at the same time, they were learning C plus plus, the C plus plus language as well. So, if there are repeated patterns. So, the notion that a program is a sequence of instructions is very clear. You do not have to really talk about it, because you say forward 10, you see the turtle moving forward by 10 steps. So, every sequence has an immediate physical manifestation. So, that is really, that really makes it very easy to understand that the program is a sequence of steps. It is a sequence of orders. This imperative view of programming is very, very obvious. If there are repeated patterns in your picture, then you have to use iteration very naturally. If there are recursive patterns, you have to use recursion. Procedures are very naturally required. If I want to draw a house five times, I should not really replicate, I should not really copy that code five times. Instead, I should say, here is a procedure using which a turtle can draw a house. And then, I call that procedure at different places, and I will get different houses. I might want some houses to be smaller than some other houses. So, maybe that draw house procedure will take an argument which will allow me to control the size of that house. So, the point is that as the program executes, something is happening on the screen, and there is a one-to-one correspondence if you want it between what is executed and what appears in the screen. And so, the student can follow along the execution of a program in a very clear manner. If you make a mistake in an ordinary program, it is rather frustrating. If you make a mistake in a program which is drawing a picture, the result often is that you get an even more interesting picture than what you had thought about. It might be a complex periodic picture, and you would say, wow, this is really beautiful or whatever. So, mistakes in programming are not frustrating. In fact, they are actually exciting. And furthermore, again, what you see, the execution is seen as a picture in bold graphics there. And therefore, debugging is much easier. You can say that instead of turning right, it turned left over here, and clearly that is a mistake. So, lots of things which normally you would think of as being complicated sort of become very, very simple in this. Once you teach graphics, all this graphics to students, it becomes useful in several other ways. So, for example, if you are teaching them something, some complex algorithm, Newton's method for finding roots, for example, is one of the examples that we took. So, if you do that, then you can graphically visualize what the program is doing. So, you say, look, do this, and not only do you solve the problem, but please also draw on the screen what exactly is happening. So, Newton's method requires you to draw a tangent. Well, I want to see that tangent on the screen. So, in fact, what happens, what happened when I thought this was that students came back and said to me, look, so we understood this, but now we understand Newton's method better. So, not only is it a good thing for learning programming, but it is also a good thing for understanding other things as well. So, in case it is not clear what I meant by complicated patterns, I mean say something like this, this pyrograph like patterns if you have seen them. So, this is something that you can think of doing or if I want to look at a tree, I can think of a tree as being a stem to branches. On top of it, there are two smaller trees and a tree therefore, has a very nice natural recursive structure and a recursive procedure is exactly the right thing to use in order to draw trees. So, graphics turned out to be a rather useful topic in order to explain several contexts. Rather than explain the contexts independently, it turned out that if I use graphics, then lots of concepts could be explained rather easily. Here is one more very important idea, notion which could be which went quite well due to graphics. So, we started off by doing this turtle geometry where there was this one turtle and it was drawing, but of course, once you have a good thing, you want to have more of it. So, if you have, if you can draw nice pictures, then you want to draw even nicer pictures. So, soon enough we gave the students primitives by which they could draw lines, polygons, circles on the screen. Not only could they draw those lines or polygons, but we allowed those lines to be moved as well. So, how do you move a line? Well, you create a line saying L equals line something, something and then you write L dot move. So, L dot move turns out to be a very natural way of moving a line and it is in fact a very good example of an object oriented, object oriented programming system. So, object orientation comes out quite naturally in this. The notion of inheritance also comes out very, very cleanly without having to explain much. Here is the reason. So, if I want to move a line, the kinds of things that I need to do are really the same things that I need to do when I want to move a polygon or when I want to move a circle. So, all these common things can be grouped together and we can think of those common things as constituting the definition of a shape and the move and things like that are written at the shape class and then the other methods are written at the polygon class. So, this notion of classes generalizing real life objects or specializing real life objects is very, very clear in this example. Rather than abstractly teaching object oriented programming, we have a really good example which the student wants to use and therefore, the student had better follow and the student does follow. Finally, at the end of it, we sort of say look, now you have learned this and at the beginning of the course, you learned about this turtle graphics. Now, I am going to tell you really, I am going to sort of take open the hood of the car and tell you what the engine inside looks like. So, in fact, the turtle that you saw earlier really fitted into this same hierarchy. It was an instance of the polygon class. So, in this way, you can connect up the whole thing and you have really good examples of inheritance and methods and all of that. So, the graphics theme comes in useful really very much. In fact, I should point out that this idea is sort of really gaining support the world over. I think there was a French course which tried to teach introductory programming in the context of some kind of a geographical information system. So, the idea there was that on day one, you would not really worry about a language, but you would be given a geographical information system. Say something to do with you would see a map of Paris and you would say look, I want to go from this point in town to this point in town. How do I do that? And the only way you could do that was to write a sensible program. Not a very complicated program on day one, something rather simple, but something that you have whose structure which had some syntax which you had to understand and thereby you could find roots in the city and you could explore the city in this manner. You could ask questions about the city and you would get responses, but to do anything substantial, you would have to formulate a query which would have some interesting structure. So, that is one example. There is another example. I think of late, several colleges in the US are using robotics to teach introductory programming. So, you do not say I am just going to write an abstract program for some abstract simple problems, but we are going to write a program which is going to move this robot around. So, in some sense this is going in that flavor and I think graphics is really a great example. I think it is perhaps, I might even argue that it is a better example than robotics or even perhaps geographical information systems, but not necessarily. The graphics theme began on day one in the introductory lecture and if you look at traditional programming books, the first program that gets written is this so called hello world program. So, it is interesting to have a program which is really small, which does something very definite, which you just have to which you are using just to show the mechanics of writing a program, which you are showing just to show the mechanics of compiling and executing it. That is all very fine, but at the end of the day this is too silly. I mean you are going to teach them something really powerful and to begin in this manner is just, you have to begin with a bank. You cannot do this. So, instead of that, what we did was that I began with using the graphics package to draw some nice shapes on the screen and when we use the, when we drew some nice shapes, the students already wanted more. So, we draw a triangle, then there is a question, can we draw a pentagon? What about, can we draw more triangles and so on. So, just so there is this power that first impressions have and I think it is really important that the first lecture should be, should sort of be indicative of what the course is going to be. It should not be routine. It should really bring out the spirit of the course and I think in this sense this graphic theme, graphics theme works very well. Oh, I should perhaps pointed a few other things in this regard. So, a few other things is that C plus plus for example, requires you to write something like int main and so on. Now, on day one explaining what this int means is rather tricky. So, this is, yeah. So, I think C had this notion of void main and that void word was even worse, but int is bad enough. However, what you can do is you can use this hash define feature. So, I am going to define program as int. So, once I do this, I do not have to write int main, at least not on day one. I can write program main. So, I give, I give a, I give an include file which they need to use in order to include the graphics package. In that I sneak in this program definition as well as a result of which I do not have to explain what int means in the first day. It can come in a little later without any, without any problem. Another thing perhaps I think this is another tip that might be interesting. So, if I, if I want to draw any interesting program, any interesting picture, then I certainly need iteration. Even if I just want to write, I want to draw a pentagon. I could write forwards, forward and then turn and forward and turn five times, but it is much better for me to put it in the loop. Now, C loops are also quite tricky, not appropriate at all for day one. I mean int i equals 0, i less than 10, i plus plus. If you explain this single statement, I claim that you have really explained the whole C plus plus language. What more is there? Well, this is, this is sort of the idea is required to really understand this, constitute say 50 percent of what students learn anyway. So, you do not want to explain this on day one. So, again instead of that, you can define the macro. So, hash define, say repeat and I should be able to simply write, repeat five, say forward 10 whatever, right. So, if I want to draw a pentagon, say 72 and that is the end of it. So, this would draw a pentagon and I do not have to worry about the complicated syntax of our statements. No, no need to know what a variable is. Just understand that a program is a sequence of orders, that is it. So, keep, keep, separate your concepts. So, on day one, all that you are expecting students to understand is the notion of a program being a sequence of orders plus a repeat statement, which is really trivial. So, anybody can understand it. So, back to this. The second theme was that you should begin with a problem. So, for example, now that we have graphics along with us, we can get carried away and want to draw everything. So, for example, we want to plot the movement of gas particles on the screen. Why not? So, you have particles moving along. You want them to collide. Maybe you do not necessarily want them to collide with each other, but they collide against the walls of that chamber. So, you need to keep track of thousands of molecules, thousands of particles. And the point at which I introduce this problem, there was no real way to keep track of thousands of particles without writing separate data structures for each particle. So, whatever, int, particle 1, x coordinate, int, particle 2, x coordinate and so on, that had to be written. So, obviously, at this point, the notion of arrays is extremely important. And at that point, you say, if I want to keep track of a thousand particles, I do not want to give thousand names and write them out explicitly. I want to use an array. So, rather than beginning the lecture by saying that today we are going to learn about arrays, which I am surprised that several textbooks actually do. Instead of that, we should begin with a problem. And I have followed this in almost every lecture in this course. Be it on lists, be it on trees, construct a real, construct as real problem, which makes it imperative that you use that new feature and do not ever try to explain the feature without proper motivation. Now, one more important theme is that do not underestimate students. Do not say that, look, if I tell them this, they will learn it by heart and that is it. No, no, no. You want them to use things. You want to expect them that, expect that they will ask more questions about it. And so, several things are needed. So, for example, we already said that good motivating examples are needed. So, when you talk about recursion, you can sort of wing it and you can say, this is roughly what happens. Better than that, draw out all the recursive, all the pictures in which you show how recursion is exactly implemented. What happens? Well, you do not have to talk about stacks, but you can say that some kind of an activation record is created where the first instance, if it is the same variable, there are copies of variables in different places. So, actually, you can explain this, forget recursion. Even for a procedure call, you should really explain it. And then, when it comes to recursion, all that is second, all that happens automatically. Pointers, for example, if pointers are useful for lists, then you may do lists and you may say, that is the end of the story. But why, I mean, that sort of says that here is a solution which works only in one context. Instead of that, if you can say, look, the same solution is used to build trees, at least give a little bit more so that it does not become sort of a trick solution to a problem, but it is understood as a much more general strategy. I think then that works much nicer. And again, since we had graphics with as, I gave out an assignment in which I talked about trees. So, say, balance search trees, then the balance trees, students actually had to draw the balance trees on the screen. And many students came back and said that that was quite a lot of fun. Connecting to other disciplines is quite important. Newton's method for finding roots is a very good example of this. Simulating movements of charged particles is also a very nice example. Here is one more example that I use which works quite well. And this is connected to the so-called Fibonacci numbers, but these numbers were actually invented before Fibonacci by a poet, mathematician, Grammarian, called Himachandra. So, he actually invented them in a completely different context. So, he was a poet and he wanted to ask, he asked the following question. So, in I guess in every language, but more so in Sanskrit and things like that, and languages descending from that, there is a notion of a meter where there are beats and you have to fit in syllables. So, you might have a poetic meter consisting of four beats and in each beat or in whatever say eight beats and you could use two beats to fit in one syllable or you could use one beat to fit in one syllable. There could be a long syllable or there could be a short syllable. So, the question that Himachandra was interested in is, suppose I have a meter which consists of eight beats, how many different ways are there of fitting in syllables into this meter? So, I have four, I have a period equivalent to four beats given to me. I can all, I can put them all, put them, put short, eight short syllables into this eight beat period or I could put four long and sorry, four long syllables into this eight beat period or I can do some combination of those. So, I could put in three long and two shorts and order them differently and so I can get many, many combinations. So, his question was, how many ways are there of doing this? And he actually wrote down the recurrence to solve this problem. This is way before, this is before Primanachi. So, he wrote down that recurrence and he actually solved it. Not only did he do that, he actually attributed it to another, the work of another mathematician, Pingala, who predated him by some 800 century, 800 years. So, this history is actually quite interesting and the story also went out quite nicely with the students. They understood the, they understood the recursion. They sort of saw that Himachandra, so that there was some non-trivial mathematics happening in India. So, it is actually a nice, so stories like these are actually quite nice to tell. Cool algorithms are extremely important. Newton's algorithm is quite nice, very cool. Searching trees is actually very pretty. If I have a list, then searching a list takes much longer than searching a tree. If I have a balanced tree sitting on my screen and if the turtle moves and goes to the right leaf, to the correct leaf, that is also, that also makes for a lot of pleasant graphics. And it takes some amount of work for the, work to do that for the turtle. I talked about another interesting algorithm and this was an algorithm for computing shortest paths. Now, shortest paths, the way it is taught in algorithm design courses is a very different algorithm from what I taught. So, in algorithm design courses, for example, there is a, there is, there are several algorithms, say, Dijkstra's algorithm, which gets taught. But this is a much simpler algorithm. It turns out that when you write matrix multiplication, just the multiplication of two matrices, instead of using multiplication and addition, if you replace multiply with addition and addition with the minimum operator and you keep doing this multiplication several times, then you effectively get shortest paths. So, the algorithm description is actually very compact. Students are just about at the same time doing linear algebra. So, they are curious about matrices. So, often in mathematics courses, you are just told that here is a matrix, here is matrix inversion, here is matrix multiplication. Why do we care about matrix multiplication? Why do we want to invert a matrix? That does not necessarily always get told, at least to the, to the real, to the great power that these objects actually have. So, that is never obvious. But in any case, the shortest path algorithm, you can implement, you can implement matrix multiplication using these operators instead of the standard operators and turns out that C plus plus can allow, will allow you to do this beautifully. So, C plus plus supports representation of infinity. So, perhaps you, I am sure you will be, you will be aware that modern computers implement this so called IEEE floating point standard and that standard supports infinity. So, what does that mean? If I take a number whose value is infinity and add any other number to it, it stays infinity. So, I can just write X plus Y, Z equal to X plus Y, where X is infinity, then and say Y is an ordinary number, then the result will be an infinity. So, infinity plus anything, including another infinity, adds up to, becomes an infinity. Similarly, if I take the minimum of something which is infinite and something which is finite, I get the finite quantity. So, everything happens in a very sensible manner and so you get a chance to talk about number representation and what kinds of tricks can be played at circuit design time and so on. And there is a very elegant, very compact code which can be written to compute shortest paths. So, towards the end of the semester, I taught them this, I gave, I, we gave them some additional primitives which included this so called event loop in the X window system. How many people are vaguely familiar with this notion of event loop? Well, an event loop is simply just as you are waiting for say, reading from the terminal and event loop says, look, wait for some event to happen. So, you can, yeah, so I forget the exact syntax, but it is something like while something, do something, that while something, that condition gets triggered only when some event happens. Maybe the mouse is dragged or maybe some button is clicked and then that while inside that loop, you know what condition, what event just happened. So, based on that event, you can take action. So, this is great because this is all that you really need in order to write video games. And what, I mean, what more would you want than to write video games if you are a student at of age whatever 15, 16, 17. And so, most people wrote very complicated rather interesting video games as their final projects. So, they would wait for events, they would move things around on the screen. And while this might seem sort of silly and superficial and far too much fun, it actually needed very serious computer science ideas. So, all of these, so the actual programming in a video game is actually quite sophisticated. It is as sophisticated as you can make and since the payoff is there, right there on the screen, you want to make it very, very sophisticated. And so, as a result of that, people like this, like this idea quite a bit and it got used very well. Now, of course, several people here will know that there is a very different way of dealing, handling mouse events and keyboard events and things like that. There is a notion of listeners and callbacks and all of that in say especially in the language like Java. That is also present, also present in C plus plus. But there is a lot of syntax associated with all these listeners. So, I did not get into that. After all, the listeners at the back end really use this event loop. So, I said why not give it to them? It is very, very obvious and students loved it. So, this is a little bit more related to the organization, but I think it is still important. It was important in our context and perhaps it is important in your context as well. So, the lab, so the course had I think two lecture hours every week and two hours of lab. So, it is extremely crucial to make sure that students do interesting things in the lab. So, whatever you learn, if you immediately put into action, it is going to stay with you. So, you have to carefully design the lab exercises. So, that they are fun. So, that they use material that has just been learned and in an 800 student class, of course, there is no question of the teacher doing any grading whatsoever. So, the TA is graded the material and here is a point which is perhaps important for anywhere. We were really worried that students might copy assignments and things like that and we did not really want to get into the problem. So, the final, the weightage for the labs, we kept very low, but they were marks, enough marks so that students would, even the students were not so, not too motivated would want to come to the labs and practice. So, the weightage here was quite low. Students quite liked the assignments. As I said, they were on the themes, they sort of developed the material in the lecture further. Sometimes they embarrassed it with graphics, things like that. Oh, here is something that I do not know whether, this is again, this is strictly my personal experience, but perhaps I should narrate it because it has happened more than once. So, in a course of this size, 800 students. So, the standard wisdom is that you make your material ahead, you put it on the net and allow students access to it. Now, it so happened when one lecture that the computer system in which, in the room in which I was lecturing somehow was down. So, there they had this tablet just like this one and so, I had no choice but to write on this. And as you can see, I do not really write too neatly, but at the end of that lecture, students came and told me that, look, forget your transparency is just right. And I can sort of identify with that because transparencies often go very fast. Whereas, if you are writing, you can write down and you are also, you are also subconsciously thinking when you are writing. Whereas, if you flash a transparency, you have thought about it long ago and you are sort of, you may not be in that warm frame of mind to actually, actually be thinking along. So, I found that especially with a device like this one, writing is a very, is a very serious option that you should consider. So, we have, as I said, we have a diverse group of students. So, there was one group which I understand at this point, found it, the course to mathematical. So, of course, understanding your audience and figuring out what is right for them is of course, quite important. Here are some of the things that I did not do, say for example, string classes. So, I did not pay much attention to character, to character processing. I did a little but not enough. Assertions and reasoning about programs is really important. I did a little bit of it, but a lot more needs to be done. I think if I had more time, I would certainly have done that. Programming style, no specific discussion. I tried to write programs in the style which I would advocate, but I did not really have say a lecture dedicated to this. From time to time, I would talk about you should be commenting this or instead of writing comments, you should write your names in such a way that no comments are needed. All kinds of ideas are there regarding programming style. Probably more needs to go there. And, debuggers and ideas, interactive development environments are quite useful, but they tend to have their own syntax and there is a lot of knowledge that you need to have in order to use those. So, I did not really get into that, but some of them are rather nice. There is this debugger called ddd, which allows you to trace pointers. So, that is quite useful. So, I think the ddd, if I teach the course again, I will use that ddd to explain pointers because I can just trace them out on the screen, stop execution and now see what are the pointers at this point and so that might work very nicely. So, this course in as it is taught in IIT has two lectures every week and C plus plus in my opinion is rather broke language, too much syntax. So, that itself takes a lot of time. So, doing all these things is desirable, especially if you have say three lectures every week. That is it. So, I can take questions if there are any.