In static pigeon our functions can return multiple values, so here for example we have this function zelda that's returning not just one thing but two things. It returns an integer and a string in that order, and we can have a function that returns three things or four things or five things. That's not terribly common, but it is legal. Anyway, having declared that zelda returns an integer and a string, that means that all the return statements in zelda have to have first a number value, an integer value, and then a string value in that order. Otherwise it would be an invalid return statement. The compiler would give you an error. Now when we call zelda, if we don't want to do anything with what zelda returns, that's okay. We can just call the function and then just discard what it returns. But if we are going to use what zelda returns, the only way to do it is to call it in a so-called multi-value context, and what that means is you have an assignment where there are multiple targets. We haven't seen this before. This is an assignment where we're signing to both x and y in that order, and then the value is what zelda returns, and zelda's returning an integer and a string. So this is okay. What we can't do, what you might assume we should be able to do, is something like this where zelda's just returning an integer and then we ignore the string. This is not legal. Nor can you do this where en as a function expecting an integer and a string, and hey, that's what zelda returns. But no, you can't do this. You can't directly take what zelda returns and pass it on to another function. The only way to have what zelda returns passed on to en is to assign the values to some variables and then pass those variables to en. A structure for structure is a data type that we defined in our code. We give it a name, in this case Ronald, and then we specify what elements, what fields, as we say, make up this data type. Here Ronald has one field which has the name foo and the type string, and another field which has the name bar and the type float. So every Ronald value is made up of these two things. Every Ronald value has its own string foo and its own float bar. There isn't really a sense of order amongst the fields, so the fact that we put this field first and this one second doesn't really have any consequence for what Ronald represents. There's no sense of order amongst your fields, except when we create values of this type, we do so by using the type name as an operator and then we list values for the fields and we do so in the order that we wrote them here, top to bottom. So we put the string first before the float because we put the string field before this float field. Otherwise, the order doesn't really matter. That's just a syntax thing, so it knows which value plugs into what field. Because of course it is actually possible you can have multiple fields of the same type. We can have an act field which is also a string. There's no limit on that. As long as they have different names. The names have to be unique. That's all that matters. Anyway, so in main here, we're creating a variable R of type Ronald and to access the fields of a struct value, we use the get operator and you specify the struct value, which you want to get a field from and then the field name and be clear. This here is an expression. This in this case is a variable R. It could be some function called it returns a struct, a Ronald struct. It could be anything that gets us a Ronald value. But then when you specify the field name, that's not an expression. That's really just the name plugged directly into the operation. And because the compiler knows, looking at this, it knows that this expression returns a Ronald value. It knows what the acceptable names are. In this case, Ronald has two fields foo or bar. So if you wrote some other name here, you'd get an error at compile time. Anyway, so if we get the foo field from this Ronald value, then we get back an empty string. If we get the bar field of R, then we get back 0.0 because we haven't assigned anything to R and the default value of a struct value has default values for all the fields. So the default value of a string is empty string and the default value for float is 0.0. So that's why we get back these values. But then here, this operation is creating a Ronald value, which we're assigning to R and that effectively copies all the respective fields from this value to R. So this is just a handy way of initializing all the fields of R in one go. So now when we get foo of R, we get back the string high. And to modify the values of a field, we use set. So we say set. This is an expression, which is some struct value, in this case, the variable R. We specify the name of the field we want to modify and then the value for that field. And again, this is also an expression. It's just anything that in this case gets us a float. The compiler will complain if we put the wrong kind of value here because it knows what type of thing bar is supposed to be. It knows that R is a Ronald and Ronald has this field bar, which is a float. So if we made this a string or something else, anything not a float, we'd get a compilation error. Now here's a slightly more realistic example of what a struct might look like. Here's a struct representing a cat.  It has an age, which is an integer, a weight, which is a float, and a name, which is a string. And then we can define this function eat, where one of the parameters, one of the inputs, is a cat. And what we're doing with a cat is we're feeding it food. It's eating food. And the food is just some float number representing an amount of food in terms of its weight, pounds or kilograms, doesn't matter. Anyway, so when a cat eats, its weight increases by the amount of food it consumes. So what we're doing is we're getting the weight of our cat, adding that to the weight of food and then setting that to be the new weight of the cat. And understand that the set operator returns the value being set. So it's modifying the weight field of C, but then it's also returning effectively this value. And so that's what this function eat returns when we call it. So down in main, if we create a cat variable C and then initialize it, so it has these initial values, 10 for the age, 8.9 for the weight, and the string mittens for the name. If we then call eat on C, passing in 0.7, what we get back is 9.6, because in the function it's taking the weight of the cat, which is 8.9, adding 0.7 to that, we get 9.6, and that's what's being returned. But then after eating, we look at our cat's weight, and it hasn't changed, it's still 8.9. So what's going on here? Well, you need to understand that when you pass this cat C in main to the parameter C of eat, first off be clear, these are separate variables, right? So there's separate cat values. What's actually happening in the call, and this is basically true for all arguments to functions, is that the argument is copied to the parameter variable. So this C is copied to this C such that if we modify C and eat, the parameter C and eat, that has no effect on the C out in main. They're really just separate things. Now there are scenarios where you'll want to pass something into a function and have that function modify the thing as seen by the caller. The caller wants something to be modified by a function. And a function can do that when it receives something passed by reference, which is what happened with lists. List variables as we discussed really are just storing references to the actual list so you can have multiple variables all pointing to the same list. So if we want to pass in a struct or other kind of thing by reference, we're going to need to be able to create references to structs and other kinds of things. And as you'll see later, we can do that with what are called pointers. First though, I want to talk about methods. Methods are a minor variation of a function where the first parameter as a rule has to be a struct type. It can't be any other type in static pigeon. And we say that a method belongs to the struct type of this first parameter. So here this method eat, it belongs to cat, and this method eat belongs to dog. And these two methods can coexist just fine because they are methods of different types. Even though they have the same name, normally that would be a problem, right? You can't have two functions called eat. But this is okay because they're methods of different types. The cat type can only have one method eat. The dog type can only have one method eat. Any number of types can all have a method called eat. And in this case, the eat methods look similar. They have the same argument and return type and basically the same code. But that's just coincidence. You can have methods of the same name for different types that do totally different things. That's entirely up to you. But anyway, in Maine, here we have a local C of type cat and a local D of type dog.  That's this thing up here. It's expecting a cat and a food value and a float value. But to call the methods, we can't just call them like normal. We need the MC operator, the method call operator. And first you specify the name of the method and be clear. The name you specify is not an expression. It's just the actual name, just like with get and struct fields. And then you have all the arguments that you want to pass to that method. And the important thing here is that the compiler knows which method we're talking about. We have two eat methods here, but it knows for each call which one to invoke based on the type of the first argument. Because here we're calling eat where the first argument is a cat. It knows that we want to call this method. And in this line on the second time, the first argument has the type dog. And so it knows that we're calling this method. Now you're probably wondering, what is the point? Because as described so far, methods aren't really doing anything useful for us. We could just create normal functions and give them different names. It's just a very small, stylistic allowance so we can have these methods of the same name. Well, what makes methods actually useful is their connection to what are called interfaces. And interface is another kind of data type, which we define at the top level of our code. And because it's a data type, the names we give them are uppercase letters. So this here is to find in an interface called Jack. But what comprises an interface is not elements of data, but rather a list of what are called method signatures. A function signature is everything about a function which the caller needs to know about the function. So it's the name of the function so that we can call it by name. The parameter type so we know what's passed to it. And then the return type so that we know what we're getting back. But everything else about the function, the names of the parameters rather than their types, we don't care about that. And also the actual body of code, that's not part of the signature. That's the business of the function itself. The signature is just what we need to know as the caller. So for a method, a method signature is the same deal. It's everything we need to know about a method to call it minus the names of the parameters and the actual body of code. So here in interface Jack, we have in no particular order, we have a list of method signatures. The order doesn't matter. We can swap these around. But here first, it's a method signature where the method is named foo. And then the input types are integer, then string, and we return string. And a method bar that takes nothing and returns nothing. So that's the two methods here in this Jack interface. And then if we have some struct type, which has methods matching all of these signatures, then that struct type is said to implement the interface. So here, for example, we have cats. So here, for example, we have the cat type and the dog type with both of those methods of the interface Jack. So both cat and dog are implementing Jack. They could have other methods. It doesn't matter though, for the sake of implementing the interface, as long as they have these, then they implement the interface. And notice that the actual struct type, of course, is present in the methods. And we specify the method signatures up here. You don't specify the struct type because that differs for the different implementing types. Dog gets plugged in here as the first argument and cat gets plugged in here. Now the significance of a struct implementing an interface is that, down here, we can create variables of an interface type. And then having done so, what that variable can store is a reference to a value of an implementing type. So because cat implements Jack, we can assign cat values to a Jack variable. So we can assign C to J here. And what's happening is, well, implicitly, it's the same as this. You can take a cat value and from it create a Jack value. That's what this is saying. You don't ever really have to write this though, because as far as the compiler is concerned, implementing types, implementing structs are considered valid instances of the interface type. A cat is a Jack value. So you don't have to write this. But you could. And what's going on here is that J is storing a reference to the cat value. But then it's also storing a reference to the cat type. And the way this is represented in memory is that because of how method calls are implemented, there are cases where at runtime it needs to look up where the actual method is in memory. So for every struct type, there's a so-called method table, which is a list of all the methods of that struct type and where they're found in memory. Anyway, we can use a reference to a struct's method table as in a sense a representation of the type itself. And so that's what these interface values do. An interface value is a reference to an actual instance of the struct, an actual value of the struct, but then also to its method table. And that's important because when we assign this cat struct J later on, in some cases, we want to know what actual type is stored in J. If we just had a reference to the struct value itself, then, well, because it might be a cat, it might be a dog, the reference itself wouldn't tell you what kind of thing it is. And so we need to also, in a sense, include a record of what the actual type of the thing is. So that's why we also have a reference to the struct's method table. Anyway, also understand that initially, because a interface variable is, in a sense, a reference and its initial value is nil, it points to nothing. So right here, before assigning anything to J, initially, it'll just have the value nil. Now, what can we do with these interface values? Well, as far as the compiler is concerned, it doesn't presume to know what J is other than it's a Jack. It doesn't know concretely whether it's a cat or dog or some other type that might implement the interface. As far as it knows, it's just a Jack value. And so all the compiler will let you do with a value of type Jack is what it knows is valid for type Jack, and that is calling methods of this interface because it's guaranteed that implementers of an interface will have those methods. And it's known for sure that whatever J is here, whether it's a cat or a dog, the compiler can know for sure that, well, it's going to have a foo method and it's going to have a bar method matching these signatures. So that is the significance of interfaces. Interfaces, in a sense, are representing the set of methods which other types will have in common. You have some set of structs, and they have some set of method signatures in common. An interface lets you express that commonality and tell the compiler, hey, all those different kinds of things, they're different types, but they all have this set of methods in common. And so if we call the method bar on J, what this does is that compile time, again, the compiler does not know what J is, it just knows it's a Jack. But at runtime, the language will look at J and see that, oh, it's pointing to the cat method table. So what it references must be a cat. And so this is calling the method bar of cat. So in this case, actually, it would be equivalent to if we wrote MC bar C. That would be exactly the same result here. Actually, there is a subtle distinction here. When we assign a struct value to an interface variable, it doesn't create a reference to that actual variable, it creates a copy of the value. So having to assign C to J here, you would think, well, if J is referencing C, then if I modify C somehow, if I don't know, set its name to something else, set its name to Oscar, that's the name of my cat. You would think that this would modify what J is referencing, but no, it's just modifying C, because J is actually getting a reference to a copy of C, so it's a subtle distinction there. Anyway, what the compiler won't let us do with J is call any other method. Even though we can look at this code and trivially say that, well, of course, it's holding a cat, and so it should be okay to call the meow method. Assuming cat has a meow method on J, that should be fine, right? But no, the compiler doesn't let us do it because it can't, for certain, say that J is going to be a cat. We can look at this code and know that J is going to be a cat when this is reached, but there are many cases where imagine like this in between here, there's a bunch of branching logic where depending upon what happens, J gets assigned a cat, but then another branch gets assigned a dog. So these cases where, in most cases, actually where the compiler can't know what an interface value is actually referencing, what concrete type it has, that compiler can't know. And so it doesn't ever presume to know, even though in a case like this, trivially, it could see, yeah, it's just holding a cat. But because in many cases, it can't know, it just doesn't presume to ever know. Anyway, so the compiler will reject this, even if cat has a meow method. This is not valid because the jack type doesn't have any such method. And similarly, we can't access the fields of our cat when it's stored in a J because, again, as far as the compiler is concerned, the only thing it knows about jack is that it has those two methods. It doesn't know what fields it has. It could be, you know, because concretely, if it's a cat or a dog, they can have different types of things, different fields. So it wouldn't know for sure that whatever jack is that it actually has a name field. So this is not allowed either. And then here we're assigning to J the value of D, this dog. And again, actually strictly speaking, it's creating a copy of that and storing a reference to that copy of the dog struct value. And now, because J is referencing a dog, because it's referencing a dog struct and then also referencing the dog method table, when we call MC bar J here, it knows, looking at J, that it's a dog. And so it calls the method bar of dog, not cat. Because it knows what concrete type at runtime. It knows what the type of J is, what it references. So that's how interfaces work. Now, why are they useful? Well, one simple example is that, say, we want to create this function feed, where it takes this input, this interface type we've defined, which is called an eater. And an eater is defined to be anything which has an eat method that takes a float and returns a float. And so our function feed can take as input any type of thing, any kind of struct that implements this interface. And we don't have to care the differences between the different actual structs. We just care that it has this method eat so that for our parameter E, we can call this method passing in a float value. That's all we care about. So this gives us some flexibility because otherwise in a statically type language, when we specify what the type of something is, it has to be one type. Well, these interface types are effectively types that encompass potentially multiple other types. You can have a single interface that has many struct implementers. And so the actual concrete type at runtime of what this eater is, can vary. Admittedly, this is really a total non-issue in a dynamic language. While you would have in a dynamic language, you'd have no interfaces. You just have your feed function and some parameter E. And you would expect that whatever E gets passed in has to be something valid to pass to some function called eat. That's all that would be required there. And that would be a responsibility of the eat function to make sure that it knows what to do with whatever you pass into it. But there's no issue with the compiler fighting with us and not wanting us to pass in whatever we want to a function. So interfaces are sort of a way around the strictures of static typing. They account for a very common case where you want to have this one type, which is not actually just one type. Anyway, there are also cases where you have a value of an interface type. And aside from just calling the methods of that interface, you want to get at concretely the actual value referenced by that interface value. And we can do so with what's called a type switch statement. So here, for example, we have this function Alice, where we have this parameter J of type Jack. Assume again, Jack is an interface and it has implemented, let's say cat dog bird and potentially some other types as well. We don't care about what they are, but it has some other implementing structs. And so if we want to get whatever J is as a cat and use it as a cat, well, the compiler doesn't let us do that unless we use a type switch. And the type switch looks like this. You specify this expression here is just the interface that we want to get the value out of the thing it references. And then it's going to store that as V. And then we have different cases. For the case where J is a cat, then we do this business. And inside here, the variable V is going to be holding that cat value. But then we also have the case for dog where J was storing a dog. And so we can do this action. And in here V will be a dog value and likewise same for bird. And then in the event that it's not any of these three, maybe there's something we want to do in the event it's none of them. So we also, you can have a default clause at the end. This is optional, but you can have a default clause. And this gets executed if the type of J is neither cat, dog, or bird. And in here, the value of V is going to be still a jack value. But sometimes it's useful to just make a branching decision. You want to test, well, what type of thing actually is this? And in the event it's not one of these other things, well, you want to do something to handle those other cases. So that's a type switch. It's a kind of statement. It's just like say an if or while is a kind of statement. And effectively these are mutually exclusive cases like in an if, else, ladder.  It can't be any of those things at the same time or it's something else. So these are all mutually exclusive. Now there's a special interface which is built into the language called any. And what's special about the any interface is that it actually has no methods whatsoever. There are no method signatures. And so every type, all of your structs are considered to implement the any interface. And in fact, the other special thing about it is that even non-struct types, the built-in type, string, integer, lists, arrays, whatever, everything is considered to implement the any interface. And so given a variable of type any, we can assign to it anything, any kind of value. And it's going to store a reference to that value and then also store another reference which effectively signifies, keeps track of what kind of thing it is. So that later on, if we want to do a type switch, we can concretely get what the thing is. So here, for example, we're creating a variable a of type any and we can assign this number 35. We can explicitly cast, we can create an any value out of 35 using any name as an operator. You can do that, but it's not really ever necessary because everything just automatically is understood by the compiler to be a valid instance of the any type. So we can just directly here, like assign the string yo to a or the boolean value true to a or some cat, we can create a cat and assign it to a. So these are all valid. Just keep in mind that with this any value a, what can you do with it? Well, you really can't do much of anything because it's not known to be a string or boolean. As far as the compiler is concerned, a here is an any type. And what can you do with any? Well, it doesn't have any methods. You can't call any methods on it. All you can do is treat it as an any. So you would need like say a function that's expecting an any as input and then you could pass this any value as argument to that parameter. But otherwise you really can't do anything with any. There aren't any operations that work on any values. Also understand that any is a type like any other. So you can plug it in wherever a type is expected. And so like here, for example, we're creating an array of five any's. And so when we set values into this array a, well, that can be of any type here. It's a string, here it's a float, here it's a boolean. This is all valid because the compiler says it can be anything. Also understand when you create structs, the fields can be interface types. So like assuming again, we have our interface type jack, you can have a field of type jack. You can create a field of type any. Interfaces, including any are types like any other. And so you can specify them by name where a type is expected. And this demonstrates another case where interfaces can be useful because sometimes when you're creating your structs like you're creating a struct representing, I don't know, a person. And let's say every person has a pet. Well, there are different kinds of pets.  Well, the problem is those are different types. So what kind of type should the pet field be? Well, one solution to that problem is that you can create an interface, say animal, which encompasses all those other types. They can all implement the animal interface. And thereby you kind of a field of your struct for your person where the pet can be an animal. And then what that animal is can vary. It can be a bird or a dog or a cat. There are cases where we need a piece of data to sometimes be this one type but then maybe this other type or this other type. And that's what interfaces provide us. It's a data type which concretely can be one thing or another thing or another thing as long as all those things implement the interface. Lastly, understand that we can use type switches for the any type. And when we do so, these cases for other interface types the types you specify in each case have to be struct types. But here we have cases where it's built in types like integer or string or could be like array of string or just any type that's possible with any because the any interface can encompass things that aren't structs. I mentioned in passing earlier that we have what are called pointers and pointers are basically just references. They are memory addresses pointing to values elsewhere in memory. But the very important thing about pointers is that they are typed. Meaning you don't just have pointers pointing to anything, you have pointers to strings, pointers to integers, pointers to floats, pointers to whatever, and those are all considered to be different types of pointers. Just like when we create slices, lists and arrays, they are arrays and slices and lists of particular type. They're not just considered the same kind of thing. So here, for example, in main we're creating a variable I of type integer and then also variable P which is a pointer to integer. That's what this denotes. And what this means is that I can store in P I can assign to P values which are addresses of integers, not other kinds of things. And so the way we get a pointer value is by using the rough operator and the argument to rough, the operand of rough is not an expression that has to be the name of a variable. So here it's the variable I. It could be like some function returning an integer. If we had some function foo that returned an integer this wouldn't be valid because you can't get the address of values, you can get the address of variables because variables are storage locations. So this is valid. And so now P is going to be storing the address of the variable I. We then assigned to I the value four and here if we attempt to add the value of P to seven this is not valid because P itself is not directly storing an integer value it's storing the address of some integer elsewhere in memory. And so this is not considered valid. You can't directly just use the value pointed to by using the pointer itself. That's not considered valid. If you want to get the value pointed to by a pointer you have to dereference it and for that we have the dereference operator and so the operand for this is a pointer value. So in this case of the variable P. So this is getting the value at the location referenced by pointer P and then adding seven to it and returning it in this case we're gonna get the value 11. We can use the set operator to modify the value at the location represented by a pointer. So here P is pointing to I and if we set two to P that effectively is the same as assigning two to I. And so now if we print the value of I after setting P to two it's gonna be two. So through pointers you can modify the locations they point to. You can change the value stored there. The default value for a pointer is nil. So here we're creating this variable P which is a pointer to float and it's gonna start out with the value nil before we assign it anything and keep in mind that you don't wanna try and dereference a nil pointer. That doesn't make any sense because it points to nothing. So you can't get the value pointed to by nothing.  The compiler can't know for sure what the value of any pointer variable is. So it can't know when things are nil. It doesn't ever presume to know even in cases where it could check. But the language does check at runtime. Every time you dereference a pointer it checks to make sure it's not nil. And if it is nil you get a runtime error at the program of boards. Okay, so now why would you want to use pointers? Well, there are a few reasons. One is that by using pointers there are references and if you have multiple references pointed to the same value then a change to the value is seen by all of those references. And sometimes that's useful. This is a very artificial example but it does sort of illustrate the point that if we have here pointer one, pointer two, pointer three and they're all referencing in the same local variable i. They all have the address of i. Well, if we modify i that change is seen through all of these pointers. If we dereference p1, p2 and p3 each time we're getting back nine because they're all pointing to the same location and memory. There are scenarios where this is very useful because you have this one thing in code that from other parts of code you want to be able to access that value and modify that value and you want the different parts of code to all see the same change. If any part of code changes that you want the other parts of code to also see that change. So that can be useful especially across different functions. So be clear like you can pass this argument a pointer value to another function and you can return pointers from functions. And so you can share references to pieces of data to locations and memory across different parts of your code and sometimes again that can be very useful. Another use of pointers and arguably this is actually just a variation of what I just described. But a very common scenario is you want to pass something into a function and have the function modify the thing such that the caller sees the change. Well, if you just pass an ordinary value like an integer into a function what the function is actually getting is a copy of that value. If it changes it in the function the caller doesn't see that. But if we pass a pointer into a function in the function by using set or a dref then that function by using set can modify what's stored at the location which the caller sees. So here for example we have this function foo which takes in a pointer to an integer and then it sets the value at that location of the pointer to be 11. Well then in main if we have this variable z which is an integer initialize it to five and then call foo passing in a pointer to z. Well then after the call to foo the variable z now has a new value it has the value 11 because this function foo actually modified the variable in the calling function main. So that's a very common scenario of how pointers can be used. The last big reason that we use pointers is that memory addresses are always the same size. Within a single system at least if it's a 32-bit system all your addresses are gonna be 32 bits in size they're gonna be four bytes on a 64-bit system all your addresses are gonna be 64 bits they're gonna be eight bytes in size. And so if I have an address and it's a address of a very large struct or a small struct or a very large array or a small array that address is always gonna be the same size it's just four or eight bytes. It's relatively small compared to much larger things like big arrays. And so one reason to use pointers is that we don't wanna have to copy very large things we wanna avoid that overhead because it can get very expensive and bog our program down. So instead we use pointers and so here for example imagine cat is some very large struct type rather than having our function take a cat itself it just receives a pointer to a cat and we have to be careful then and make sure that and understand that if we modify the cat then the caller will see those changes we have to make sure that's what we want but it is more efficient to pass in just a pointer to a cat rather than the cat itself because otherwise if the C parameter here was just a cat then the cat value would have to be copied in full every time we call this function foo. And again if the cat is a very large type that could be expensive. Likewise here if this function bar if it's nums parameter we're just directly an array of 50 integers well array of 50 integers that's quite large every integer it's either four or eight bytes and multiply that by 50 so it's quite large at least compared to a pointer it'd be cheaper if our function bar took as input a pointer to an array of 50 integers and that's what this is and so again that could be more efficient it avoids that big copy though I should be clear when dealing with arrays in static pigeon because we have slices and slices effectively represent references to arrays we use slices much more commonly than we use pointers to arrays you can have pointers to arrays but much more commonly we'll just use a slice instead so this is more realistic in that particular case but for structs we don't have any analog of slices so we would use pointers last thing about pointers is that we can use rough to get pointers to fields of struct variables and indexes of array variables and so here for example we have this cat variable c and we're using rough to get a pointer to the name field of the cat which is a string so p here is a point of the string so this returns a point of the string value referencing name within the cat variable c and that's what stored in p is that location and then down here we have an array of 10 integers and a pointer to integer and so because the array is composed of integers if we get a reference to index two of the array we're getting a pointer value pointing to that location within the array and it's a pointer to an integer be clear though this is very important and it's a subtle thing the first operand to ref and in all cases across the board has to be a variable it can't be just a value it has to be a variable that means that you can't have something like this where say this function foo returns a cat and we call foo and we want to get a pointer to the name field of that returned cat value the reason language just allows us the reason it only lets us use rough to get locations of variables and also fields and indexes within variables it's really just implementation details the way the compiler converts our code into machine instructions the way it implements function calls if it allowed for something like this it would be very inefficient it would slow the whole code down so just to avoid those inefficiencies or something that you would really not really want to do very often anyway it just disallows it it's not common you would even want to do this so just understand that you can't we can only use rough on variables we saw in dynamic pigeon that we can treat functions like values meaning we can store them in variables we can store them in lists and maps we can pass them into functions we can return them out of functions, et cetera we can do the same in static pigeon but to satisfy the compiler we have to distinguish between different kinds of functions what kinds of inputs a function takes and what it returns that's part of the type of the function and so here if I create a variable f to store a function I'd say it's a function variable but then I've specified what kind of function and in this case it's a function that takes an integer and a float and returns a string and therefore what I can assign to f here is any function with this set of inputs and outputs like bar here for example bar matches so this is an okay assignment we can assign bar to f and if I call f with arguments eight and 2.0 then it's calling this function bar but what I can't do is assign some other kind of function to f foo here for example is not quite right it's missing the return type of string it returns nothing and so it would be invalid to assign foo to f so the compiler will not allow this assignment and do understand that these function variables a function as a value is actually a kind of reference the function exists somewhere in memory and what the variable storing is really just an address of where that function is located and so if you create a function variable its initial value its default value is nil and just like with pointers it's invalid to try and use a pointer that is nil well same if we try and call a function that's nil so f here while it's nil if we try and make this call we get a runtime error and again like usual the compiler never presumes to know what the actual value of any variable is it knows the type but it doesn't know the value so even though trivially we can look at this code and say well of course f is gonna be nil the compiler doesn't check for these cases and so it doesn't stop us from compiling and running this code but then at runtime f will be nil in this case and so this call will be invalid and oops I have a wrong type there there now it's a float and now it's good but this will be a runtime error here's an example of a function which takes its input a function for its first argument so the parameter a here its type is a function taking an integer as input and returning a string as output the second parameter is just a normal integer parameter and then the return type of Jared itself is a function which takes nothing and returns a float so it's a little confusing to look at this I know because of all the colons and angle brackets all over the place but that's what's going on Jared has one input, a second input and then the single return type so when we call Jared the first argument has to be something which is a function taking an integer as its only parameter and returning a string as its only return value and what Jared is going to return must be a function that takes no inputs and returns a float and the compiler will enforce that


I'm coming out on my balcony of my amazing YouTube studio because there is so much loud music in my house Because something is always going on, but the best kind of thing is going on today I woke up with a text from my dad saying he got on a plane to LA and he is Landing so that got me out of bed real quick. By the way mom if you're watching I did not convince him to come I swear to God my poor mom is in Ireland But she's obviously having the time of her life too now I thought it would be really cool because my dad has not met the cat yet to show my dad his new Grand cat because yes, we're very weird in this family Just like my sister had to fly a rabbit all the way to Houston, Texas to show the rabbit to his new grandfather I cannot wait to show my dad the cat because like we have not had a cat since I was a kid since my dad brought Me home a little cat named rascal.  Don't forget to subscribe like comment on this video. What do you guys think? He's gonna say I have no idea. He might just think we're totally crazy I think he's gonna say you know what I think you guys need to move to a farm instead of this stuff You need some big land where you can all go and just have all the animals Yes, won't that be better and then he'll proceed to drive me around in all the farmland in California Way way out where there's no Starbucks and tell me that I could build a rescue in the middle of nowhere Yes, he did that last time he was here. Okay. Let's see what happens. Oh, I can't wait Is the cat cute the cat's cute enough right like the cat's cute enough to steal the show see look for the alright She thinks he's here What What hold on hold on hold on George What did you do to Sandy I told you I need a nation or George would get Did you shave her just give us more time? I So Harry's wearing a blue bandana because I got into a sorority Cap a cap a gamma and we wear blue and blue so Harry had to get in the sorority to Maybe You know a lion cuts for a cat right Here for where is he not here? He didn't make the flight But you look at the text No, he's not he might come tomorrow night. Oh, no, really? Yeah, you're lying What do you talk about? There's no talk about him not getting on the plane. It just says he's gonna get an Uber Yeah, he thought he would he's gonna come tomorrow night. Don't worry. You're lying to me. That's your lying smirk I know you can't lie to me Is that him and I miss him another friend Let's see that I need to reread these texts. You're just like six on stress Stop it. Go away. Let me see arrives 146, which is to I will come with uber lift That's the last thing. Okay. I don't get where I was supposed to understand We joked about who's fault. It is then we talked about cake and something about a unicorn Yeah, I'm editing a video. No, you're not the windows open. Dad's upstairs. Be happy No Coffee I thought you were like off Starbucks. We got the cat so you have a Starbucks the cat instead of a Starbucks I know He didn't get on the flight. I don't get it. Where is he? I told you he's coming tomorrow. You could sleep over How do you know this? What are you saying? Look at the text because I called him. Oh So you don't come to see me. You only come to see dad. I do come to see you guys So you didn't get on the flight. I want dad to Meet the cat.  Why is he teasing us like that? I don't know and I think he wanted to and I think like he didn't get on the flight Our mom wouldn't let him get on stress. You're so crazy. What do you mean? Don't stress. I'm stressed I wanted dad to come here.  I did arm day yesterday.  He's gonna feel that he actually feels really bad. He can't come I don't think you should call him because everyone called him already. Why didn't I even get a text? There's no way we're he's getting on the other flight. I know if there's no way He went to the airport for one flight and went home and gave up dad doesn't give up So he's definitely at the airport or he's on a plane and he's gonna land in two hours or in an hour Oh my god, my dad is in the car. He's taking so long Jenna didn't notice Look at him. Can you take any longer dad? Can you take any longer? Oh look? He's got his famous bowling bag. Jenna's not noticing I'm gonna show you in the sunlight. I want to show you something come here dad Here's the cat. You got it. Oh, what a beautiful cat right by the cat. Hello. It's the bike Isn't she cute dad? What a beautiful cat. What's that? I don't know Sal Sal Daniela. Oh, yeah. Yeah, what did you send me? He's very upset about Picasso Yeah, oh my god, look, what is it? He sent me like a Donissi crystal. What is that? It takes your energy back to zero point What it's the original energy state where nature is before any other energy waves Interact with our own when you are at zero point you feel balanced and grounded look at the crystal and dad This is a really I can feel this. It's like cleansing Charging station what charge it you shouldn't need it. I have a crystal charging station It's wireless It's wireless. It's more crystals Charging crystals Wow This is amazing. Thank you, Sal Dad, did you ever see first of all we got this also Wow. Oh, did you see we have lizards? No, I never see one like Where is it Jenna? Can you get it out? I'm not getting it out and wants to bite me. Oh my god She's huge. Yeah, bigger one. Yeah, we're gonna get her a bigger thing now. It's further back. She's more back here. Look dad. Oh Yeah, I can see that's Pascal and this is Stanley Stanley usually likes being in the back dad see him on the wall But it's messy right now because I'm editing oh wow different colors, right? Isn't it nice? That's where I sit and do stuff Fan made that for the birds Lovely isn't it cute and the cat has her section the birds have sections I'm in the middle of editing a video the dog has a section and that's a story Hey guys, I hope you like this episode of my dad meeting the cat It kind of went in a completely different direction than I imagine just like most episodes anyway we all ate dinner and I Kind of have to sign off now before my face blows up because I might be having an allergic reaction Don't be alarmed happens all the time. Love you guys so so Much don't forget to subscribe. Let me know what your favorite part of this video is Bye guys one more thing Thank you, so I'm wearing this forever


Welcome to our Web Programming and Information Architecture Pathway and Q&A with advisors. Today's workshop is part of our pathway series introducing the different MLIS career pathways where you'll get an insight perspective from instructors who have worked in specific fields. So let's get started with our agenda. Today's agenda consists of an overview of the Web Programming and Information Architecture Pathway which courses students can consider, why, how students use the skill set, and then we'll meet faculty with expertise in this area who have made themselves available to answer your questions. So what is Web Programming and Information Architecture? Well, it concentrates on the theories and basic concepts and tools and supporting techniques related to the design, building and management of information systems and web applications. It also includes design and development of user-centered information systems and a variety of information environments, along with web applications, web and web programming languages. So here's a list of the core theory and knowledge that students pursuing the pathway would benefit from in building skill sets toward a career in this area. Analyze and determine library computing requirements, develop new means of delivering service, coordinate and implement new electronic services, and support ongoing services, along with identify specific needs for technologies in information search and management, along with understand computing fundamentals, data structures, operating systems, usability issues, website design and creation and web programming scripting languages, and finally master the tools and concepts necessary to work with a team. Foundational course details are on the website in yellow, and recommended courses such as Info 241, Automated Library Services, and Info 247, Vocabulary Design. So now I'll turn it over to Sheila. Thanks, Taryn. So our program advisory committee for this pathway has determined three areas of emphasis within the web programming and information architecture pathway, which some students may find useful in order to target their developing skill sets for an eventual job search in one of three areas. Managing databases and the integrated library system, website development and social media management, and finally user experience. Now while all of our students earn an MLIS degree from the school, no special designation will appear on the academic transcripts or diplomas. Students might include areas of emphasis information about their skill sets on resumes or in cover letters during the job search. Now whether you'd like to pursue database management, web programming, or user experience work in academic or public libraries, government, or even corporate work settings, the MLIS Skills at Work report found on the iSchool website has you covered with valuable analyses that will help you prepare yourself for the job marketplace. The report found that specific technology skills are in demand in both traditional library and in non-traditional jobs. Among other insights, the report found that 16% of the jobs surveyed required web services and programming HTML, CSS, JavaScript, CSEO analytics as required technology skills. And data analysis tools included Python, R, SPSS, Power BI, ArcGIS, Tableau, Data Studio. They were listed in 12% of the postings. And application programming tools such as SQL, Java, Perl, PHP, Ruby, MS Windows, Unix, Linux, Oracle were found in 9% of advertised positions. So page 48 through 51 of this report offers specific strategies and suggestions for job seekers that go beyond taking specific pathway courses. Our students can set up job alerts to come into their email with specific keywords for this pathway for jobs mentioned in the MLIS Skills report such as UX Librarian, Information Architect, or User Experience Designer. Here on the slide are just a few recent job sample job titles that I found on indeed.com. Now students can set up a folder with their saved targeted job descriptions and target the specific technologies, knowledge, skills, and abilities that you think would add and cultivate to your skill set through your coursework and your internship experiences. You can also add these to your wish list of classes in your student success planner. Now one of the takeaways from this report was the following advice. Monitor trends and technology skills and prepare to master new technologies and emerging ones. Practice learning on demand methods as part of each new course that you take. If you can, try to fit in an Info294 in-person or virtual for credit internship into your program planning or volunteer to develop your web technology skills. Do not forget to tap into all the career development supports and other resources that the school has put into place for MLIS students. A few are listed here on the slide, but a good way to organize your efforts is to make use of the career planning checklist inside your student success planner. In this way, you can set goals and milestones specific to your own career objectives. And now's the time for you to have an opportunity to hear tips and recommendations from our experts in this pathway. Three faculty who teach courses on this pathway are here with us today. First, they will introduce themselves and let you know a little bit about their background with web programming and information architecture. And then some tips learned from their leadership roles in their careers as well as specific tips on high school courses or technology trends or maybe even extracurricular or service learning opportunities that they would like to recommend to you. And so we will begin with their presentations and then later we'll be opening it up for Q&A. First up, we'll pass it over to Dr. Liu. Everybody, first I want to apologize in advance that my connection may get interrupted because I'm joining the meeting from Tianjin, China for other reasons that you all know. With that, so I'm going to try to speak as much as I could before I get cut off. I have been with the faculty for almost 30 years now and since the start I've been teaching technology oriented courses. I used to even teach a C program, sound engine, job and among the way I've been teaching database design and later got into data mining with Robin Miner. So I consider myself to be a techie guy and I've been closely associated with the technology track in the program. And so basically currently two courses besides the 202, one is the 242 which is more about designing a relational database and implemented on the Oracle platform. The other one is the 246 that's focused on data mining using a Robin Miner studio which is a GUI interface programming platform for you to process. So I'll stop here and hand over to our next speaker. Thank you so much, Dr. Liu and Professor Steve Perry. It is your turn. All right, I've been with the college. Gosh, it's been about 21 years now. I'm part-time here and I like Dr. Liu who's full-time and we used to have so many database students back in the early 2000s. I got to teach a section of Info 242 back then. We had enough students for it but it is, I highly recommend his course.  I'll try that again. I highly recommend his course because database is fundamental to anything that you're going to do to store and retrieve data even with web programming or web design and you're just going to need that. So that's very important as a base. I created a SQL course that we used to teach here at San Jose State but now I think they found another instructor to teach it in the summers only. It's just in basic SQL and I think they use MySQL there. So that's important and Dr. Liu teaches the Oracle SQL. All brands, if you will, or versions of SQL are very close to each other. Probably 85% of them are the same and the different platforms that you might use, Oracle, Microsoft, MySQL, that sort of thing. So that's sort of fundamental to information to get things stored and retrieved and I really understand that. And then we get into programming. Actually, I often call the web the marriage of publishing and programming because there's the visual component, obviously the HTML and CSS, the styling language that helps present there. We have an Info 240 course. I think it is where we offer several sections of that that teach how to put up a good face, put up a good website that looks appropriate. I do recommend that. I know the instructors for that is not here in this presentation but highly recommended. If you know that, that just helps to have a good feel of how to put together a web page and how to style it so it looks appropriate. But underneath it, web pages that just are pretty pictures don't do much. So you need programming if you want to go ahead and do something like if you were on Amazon.com wanted to buy a book and then you enter your address and your credit card information and what have you. All that is put on web forms where the programs that live on a server somewhere, as I like to call it the great computer in the sky, the cloud computing, right? So programs live up there on a server, another computer and they receive the information, process it and then return back to the user who's ever using your website back a new page usually that has the information to take the next step in whatever process you're doing like buying something on Amazon. So there are a number of languages that are very popular in the industry for doing this kind of programming. As Dr. Lou mentioned, Java is one of them. I don't think at our program, we're teaching server side Java right now, but it is one of the larger languages, also Microsoft's C plus, which again, I'm not sure if we offer a particular course on that. The two areas that we do offer the classes that I'm teaching, one is they're all under the banner of Info 246, that's sort of a catch all number to hold a number of things related to programming and technology. And so the first one there you see listed is the one that's on building web applications using PHP and Java script. Now it's a real fundamentals course. It doesn't go into deep, real deep depth, but PHP is a server side programming language where you'll get to read information off web forms, process them in some way, and then return to the user the response based on the processing. Like yes, success, you bought the book, or no, please remember to fill in your street address, whatever the validation that's taking place. Now Java script is not done on a server, not usually computer server, it's usually run actually locally on the person's computer. It's downloaded and run there. So it's a browser based language and it's very good for usability items. You can do some minor validation, like if someone's missing information in a field, you can catch that before information gets sent up to the cloud server to be processed. So you can do a little bit of work. Also it does some visual look and feel, things to make things friendly or easier to use. So we used to teach these separately under 246, PHP and Java script, but just decided that this would be a better presentation for people starting out. It's definitely introductory in nature. Now the hot language nowadays, this is the language that has saved my career, not just with San Jose State, but with the other place that I work, Palomar Community College down in San Diego County. And that is Python. Python is like right now the hot, hot, hot language for so many things. I teach a two unit Python course that's definitely introductory in nature. It shows you how to put the language together basically in an eight week period. It does not explicitly go into how to do web programming with Python, but that is done. And there are various frameworks for that. Like it's called Django, of course, it's spelled with a D Django frameworks for doing that kind of programming. And maybe we'll have that in the future, but right now we don't offer that specifically. You learn the basic language skills, then it's usually, if you take to it and you like programming, it's usually not super hard to begin to go out on your own after taking an introductory class and find the skills or framework you need to do web development with Python using something like Django. And so it's a big language. It's used a lot also for just data science applications in general, very good in cybersecurity. It's kind of one of these languages that seems to be used everywhere. Often another big application is graphic information systems, which can, of course, have a web component because using GIS applications very visual. Very often you want to see cities that are greater than 10,000 and they might be highlighted in yellow or raised in red or something to highlight on a map in a graphic information systems. So those are the two most useful web development languages that we're teaching here in our program. But I wanted to let you know about the others. Before I forget, there's another website. You had mentioned that indeed.com. But for techie jobs, one that's been out there for a couple of decades at least is called dice.com, D-I-C-E, like rolling dice. And it is all about technology. All the job postings are things about programming, web development, other computer programming languages. So it's a very good website for that kind of employment. And you can narrow it down by area code, geographic areas and what have you or they're online or not. So it's a really friendly tool to use. And I highly recommend it if you're looking for either looking for a job or looking for the kind of skill sets that people are hiring for. So you can know what to concentrate on in your own training. And let's see. And I guess that's the basics of what I wanted to say. And of course I'll take any questions whenever question time is. I assume that's after everybody speaks. So let me know. Okay. That's it for now. Super. Thank you for going through all the ins and outs. And we're delighted to welcome Dr. Tucker to speak on her courses and a little bit more about the pathway. Number two, unmute. It's always so interesting to hear from other faculty. I always learn a little bit more. I have worked with Dr. Liu for quite a while. So we know each other fairly well. And I really appreciate your introductions, Sheila and Taryn. Thank you very much for that. So they asked me to say a little bit about my background. So I'll do that briefly. It's been kind of a quilt of career segments in the information sciences. And when I got my master's in library science, my first real professional career was as an academic librarian. I worked in the area of physics, which had been my minor in study. My major as an undergrad was music, but I worked at Stanford. Oh, not ready for that slide. Sorry. Thank you. I'll get to that. First, I'm going to cover a few other things. And then I got very intrigued with online database industry and actually got recruited and worked for the big granddaddy of online databases called Dialog, which is part of ProQuest at this point. And I imagine you've used some ProQuest databases no matter where you are in the MLIS program. And I was their side tech specialist. I ended up doing training and then becoming manager of their training programs and doing computer-based training design, stand-up training. I traveled. I really enjoyed that side of it, but then I was also doing documentation. Eventually, I moved out of that area and into product development. And I was an information architect. So I had a lot to do with databases and search engine products moving onto the web and being targeted at different kind of user groups. So I learned about conducting user research, doing focus groups, doing all kinds of testing. And I was typically the person who did the prototyping and was the voice of the customer on product teams. So I interfaced a lot with software engineers, with marketing people, with licensing people. It was a really exciting position to be in. And I did that for quite a few years and then started teaching part-time for the School of Information and the first course I was teaching was the 244 course, online searching, you might know that. I no longer teach that. And then eventually started teaching the 202 Information Retrieval System Design course, which you've either taken, you are taking, or you're going to take because everybody takes that one. And I'm currently the coordinator for that course. It's one of the required core courses. And there are currently 11 faculty teaching it. So I take care of the materials and training new faculty to come up to speed on that. Dr. Liu is one of the very experienced faculty who teaches that course. And I'm just busy training two new instructors for that. So it seems like I've been in various different environments, which is true. I worked in industry for over 25 years. But it all kind of comes together and I think represents very well all the different environments that someone with an MLIS can work in. I did go back and do a PhD when I was in my late 50s through the Gateway program at the iSchool. So that's kind of a cheer for the Gateway PhD program. If any of you are thinking of doing that, I'd be happy to talk with you or you can talk to the current coordinator, Dr. Sue Allman. I used to be the PhD program coordinator, but it was an opportunity for me because I needed to keep working full time because I was raising children and be able to do a doctoral program, which made it possible for me to end up as a professor at the iSchool. It didn't just sort of happen. I make it sound like it did. What I'd like to emphasize before we move on to the next slide is something Sheila covered, and that is the importance of internships in your journey through the MLIS. If it's at all possible to fit one in, it can really strengthen what your opportunities can be. Whether you're trying to do a pivot in your career that you currently have going, or if you're looking for brand-new opportunities, an internship can make all kinds of differences in that situation that you have, your own personal situation. The other thing that goes hand-in-hand with that are graduate assistantships. These notices go out and it's often working with a faculty member. They might have a research project. I have a posting out right now. I'm looking for someone to work with me in spring semester, but those can give you a similar kind of experience. The Student Research Journal is another one of those kinds of opportunities to give you some real-world experience that can be very valuable. So I wanted to underscore what Sheila covered there. As to the courses I currently teach, I do teach in the Master of Science in Informatics program now. I teach a Human-Centered Design course. That's IMFM204. And again, I mentioned the 202 course I teach and coordinate. And then I teach one of these courses that Steve mentioned, the 246 series that has a whole range of courses within it. The one I teach is Information Architecture. And then I do advise in ePortfolio, the 289 course that almost everyone does. There are few who will do a thesis. So the other thing I wanted to cover is the important role of program advisory committees. And that's next slide, please. Thank you. So there are important ways that we keep our curriculum current and reflective of different work environments and trends. So I call this informing the curriculum. We have multiple program advisory committees that are aligned with the career pathways. So we're talking about specific pathways today. But there are other pathways and different environments. Or there might be a program advisory committee for a specific program, such as the teacher librarian program. And each committee contributes insights to the work environments that they know about or trends that they're aware of, things that they see developing. The one that's most relevant here to what we're discussing is called the Knowledge Organization Program Advisory Committee. There are others that are also very closely touched on our topic today. This is one that I know well because I co-chair it. And you can see here the committee members that I've listed. And these do change. They usually serve for a few years. But these folks represent a lot of different environments. We have Patricia DeCruz, who's actually the first two or graduates of the program. Patricia is a taxonomy specialist at Cisco. And Corey Lawrence is a search analyst at Apple Computer. And then Krista Bailey is one of the librarians at King Library on campus. I've also recently recruited Andrea Medina-Smith. She's one of our PhD students in the Gateway program. And she's a data librarian at NIST. So we've got some, you know, government, we've got industry, we've got academia. And then Annie Wu is head of metadata and digitization at University of Houston Library. So we always try and get someone who's also from tech services in academic library settings. We've had a number of really fabulous people who give their time and expertise in serving on the committee. So this is one way that we keep the curriculum up to date. We meet with them and show them, you know, what we're thinking about. We show them the career pathway pages on the website. And as for their input, it's a really valuable part of how the iSchool works and how it brings in people from the outside who are really invested in the quality of the programs we offer. As you know, and this might be a big reason why you chose San Jose State's iSchool for your MLIS. We have a lot of courses. I mean, we really do. We have a lot of faculty, a lot of part-time faculty like Steve Perry. But there's so many courses. Sometimes it's really hard to choose. I advise with students who say, you know, I'd like to take these six courses, but I really can only fit in two of them. Help me decide because we have so many electives. And this is, you know, I think a real strength of the program. So the other thing I wanted to mention is in terms of advising, there are specialists for particular subject areas. And then there are generalists, people who are willing to just sort of help you out. If you're at the beginning of the program, that might be a really good thing to do is set up a time or just reach out via email to one of the generalists who are listed on the advising page that has the advisor names and what their special areas are, the dropdown where you can say, here's what I'm interested in. But it also has, I think, four or five names of faculty who are willing to advise no matter what, who are the generalists. And that's what I wanted to cover. So we've got, thanks for putting the link in there, Sheila. Super. So that's it for me. Thank you. Thank you. And thank you for sharing your tale of being a Renaissance person through the academic and corporate worlds. And that is so valuable. So now at this point, everyone, we're ready to go and step into our Q&A portion. And this is a time for you to get advice from any of our panelists who are all experts in the curriculum and the pathway. So our Q&A should be open, ready to go. If you want, you can access it from the strip at the bottom of your window, the Q&A. Click that, and then we'll just go ahead and I will read the questions and you can let us know if it's for a specific faculty or if it's open to all the panelists to answer. So I guess while we're waiting for questions to come in, oh, here we go. We've got our first question. Okay. The question is, how is this pathway different from related ones such as data science, digital curation, digital services, and emerging technologies? But any of our panelists like to take this one on? Steve, you know, the web program could include all of those things that you've listed, their data science and digital services and everything. It's just basically the version of it that's presented through web applications. So you need those skills. Things can be, you know, data science, for example, could be just done a desktop or client server application where you're talking to a database on the server, but the application is a desktop application. So the web part of what we're doing today is really the tools you use to take that application and present it over the internet, over the web. Yeah. If we speak about the whole thing from the web program and perspective, Steve explained pretty well that if everything is going to go through the web and it's going to be about the web and the data is going to come from the web or off the web, then the whole thing, all the other tracks that you mentioned would end up getting tangled with the web program. But however, each of those other technology-oriented pathways that would have its own focus, take the big data or data science, for example, it does not have to be, or does not need to be limited to web related stuff. For example, in a typical library setting, you would have a huge data pile sitting somewhere. Circulation records is apparent to the one, and you can make some use of that. You can mine that for patterns, and you can analyze that for evidence to make decisions in your library settings. They don't need to be limited to web programming, but if they are going to be from or are going to be through the web interface or web portal of the organization, then it will get somehow interacted with the web program. Typical things, for example, let's say if you want to do a survey of your local community, then it certainly makes sense to build a web portal and to gather input from the community, and then you can go on to analyze the data using the data science skills that you have learned. That's just one example. The point I'm trying to make is that the other technology pathways would each have their own focus, and D means a package of related skills that might have some overlapping with the web track, but they are not exactly the same. I hope they manage to get the point across here. I thought that was an excellent explanation. Dr. Tucker, do you have some thoughts? Yeah, I just wanted to add in terms of kind of the purpose of those career pathways is not to say you need to pick one or pick two and split your choices of courses or your choices of where you want to work. But to help guide your decision of course selections, but to think about like the job titles or the job report and directions you might go in, but you don't need to choose one and say I'm going in the direction of emerging technologies, which is really like an umbrella in today's world. Everything has emerging technologies within it. So I just wanted to clarify that or the way both Jeffrey and Steve described the web as a place where we do a lot of our living and playing and interacting with each other is in many ways a distribution place for things that might happen in digital services. They might be doing a lot of processing of information, but might then be distributed in that way. So I just wanted to state that about the purpose behind career pathways. Thank you. And just everyone, we've talked about this before in other workshops, but just remembering that you have ultimate flexibility to pick and choose from the career pathways, which are just there as guides for students. And so we even have a tool, which is our pathway crossover tool that shows intersection. If you're interested in more than one pathway, use this tool to pull up a customized list of courses that have recommended, sorry, of pathways that have recommended courses in common to each other. So then you can kind of kill two birds with one stone, as you might say. We'll move on to the next question then. The next question is, what are your thoughts on how AI will impact this track's career opportunities in the future? And Professor Perry is going to address this. Interestingly, I got really into AI over the past year. And I gave a presentation to faculty at the other college that I worked at. About 200 people showed up one and know how it was going to affect education in particular. But one of the things that came out of my readings and stuff is this tool is going to be around for people to work with. And the rule is that AI won't take your job, but somebody using AI will. So it behooves students ultimately at some point to learn how to use these tools in a beneficial way. It presents some unique challenges to education, because we want the students to go through the process of learning how to do something thoroughly and not rely on tools like AI to do it for them. Unfortunately, from the standpoint of education, AI can write a perfectly good Python program or other programs. You can just pretty much ask it a question, give it the criteria, and it will write out a perfectly working program. Now, and so in my classes in particular, I have some guidelines on where using AI to get some enhancing knowledge is OK. But I've got some guidelines for myself and for them on how to prevent them from using it to do all the work. And that's important as well. You wouldn't want to go to a doctor and say, give them your symptoms. And they say, well, I don't know. Let's see what chat GPT says. And he'd never gone to med school. You'd be pretty nervous about that. So anybody who wants to work in web technologies or any other technology really, had better have a pretty good base of understanding it. And then you can make use of these AI tools as an enhancement. Unfortunately, in their current incarnation, it's really just getting started. They can be very, very inaccurate. And you really have to double check a lot. If anything is critical, what you're using them for, that making a mistake would be bad. You can't rely on them perfectly. Now, one day over the different successes of AI tools in the future, hopefully that problem will be addressed more and more and people have more confidence in the tool. And they're coming up with specialized AI chatbots, if you will, for medicine and law and things like that, that maybe you'll have more confidence in that they've been accurate. But as a programmer, computer programmer, I am doing a couple of little side projects just for myself. And it has been very useful to already know how to program and then use these tools to make the programming go quicker. It doesn't do everything for me, but it does little parts and test things out. I think, hey, this is great. I can right now, maybe 30% faster than I used to be able to work. So they are out there. People are going to be expecting them employers. They're going to expect that you have some sense of how to use these tools. Obviously, the famous one, chat GPT. There's, of course, Google's Bard, Microsoft Bing, which uses kind of the same thing as chat GPT, but not completely. And then there's Claude and Perplexity.  So it's worth keeping on top of it. There's one newsletter in particular called AI Rundown. I don't have the address for that right now, but AI Rundown. And it's a good little thing to get in your inbox once a day. And it just kind of keeps you up on things that are coming out there. It's a page or two. It's nothing overwhelming to read. But I recommend that you might look that up and just kind of keep up on at least overall what's going on with AI in the future. So it is a new world with this. And we're going to have to dance to keep on top of it, both as educators, obviously, and students, but going future as being employed at different places, you're going to need to know how to use it and understand it. All right, that's it. Any other comments from panelists? Or we will move to the next. I just wanted to add since kind of the area I'm in is that user research UX side is, I think, there's still going to be demand for people doing that kind of work. And I think AI can really help with writing up reports and doing drafts and then the human side of finalizing. And that can be really helpful because writing skills and collaborative skills are still in demand. I like to think that will still be true, but the drafting can certainly be important. We do have a policy now at the iSchool that if a chat GBT or other AI tool is used that it needs to be cited. I implemented that in my classes this fall and showed how to cite a tool and how it might be used and it's especially interesting in my informatics course I teach, which is a design course and it's kind of the standout in that program of not being a technology course. It's focused on design, although they use technology tools. So I just wanted to bring that up for the UX area and user research. So we still care about people and what they want and what we can sell to them. I just want to kind of keep everybody cool and calm. Just like any other technology hype, we will not be a really know the answer to that question until the dust settles. And we have a tendency to become overly enthusiastic about emerging technologies and as we have experienced over and over. Now the other thing that I want to keep in mind is that this whole thing of AI is no more than learn what is already out there. It's about discovering bad pattern and then associate that pattern with a course of action that has already been documented somewhere on the web. So it can really solve a problem for you that has not already been solved by somebody else and posted somewhere in writing on the web. So with that said, you can see that as long as we can preserve the creative and original core of our profession and I don't think the AI is going to have much impact. Thank you all. Okay, we will go to the next question, which Professor Perry is also going to answer. All right, that's good. Yeah, I agree with just before answering this next question. I agree with what Dr. Lou said. My view of the AI is that it's overhyped and overfeared. It will have a place in the world and may get better over time. But it does not think for itself. It uses things and patterns that other humans have already thought of. Like you said, it's not a sentient entity. It may feel like that to some people because it was almost like a magic trick. But everything that it puts out has been put there by another human in some way. In some way. So yeah, they're not all out to get us. I'm going to take over the robots not yet. So back about the question was put in here about Python being in demand now and an experience. Yeah, I've been programming now. We're getting up on 46 years. I started programming professionally. And languages that are very popular do hang around for quite a bit. Java was the real hot thing in the mid-90s. And Java is still there. People don't talk about it with the same buzz that they used to have. But you can get a perfectly good job coding Java, not JavaScript, although you can do that as well. JavaScript's been around for almost as long. And PHP is a language that had some buzz and it's still good for generally smaller websites, not the really large, what they call enterprise level, large corporation sites. That's more likely to be a Microsoft solution like C Sharp, which is still out there. And still plenty of employment in that and likewise. So Python has been around for a while. It just, I guess, has become very useful in a lot of different places, especially data science and cybersecurity. And it's just sort of got buzz. But I expect it to be around for quite some time. You know, maybe something else will come along five years from now that gets the buzz and is the really hot, hot language that everybody wants to learn about. But these other really mainstay languages aren't going away. When I started in the 1977 teaching, I was using a language called COBOL on mainframe computers. Now that language has definitely diminished over the years. There aren't as many mainframe programmers anymore, but I used it solid up until around 1995. I was working for a utility company, Southern California Edison. I worked professionally for 24 years as a programmer before becoming a full-time teacher. And so even today, if you work for the government and the IRS, there's still a lot of COBOL programs. So most of these things never completely die. You know, just keep, like I said, these sites like dice.com and other job sites, you can look to them and keep your finger on the pulse of the industry. And even read a trade magazine like Computer World or something like that or online. You'll get a sense if something is rising and if you need to watch that, you know, as a career shift strategy. Just really briefly, I'd like to tell the story when Bill Clinton was elected president and he started in 1993, he formed a commission of business leaders to talk about where business is going. So he could align government within needs of business. And they came up with this great report and there wasn't a word about the internet. Okay, it was 1993. Two years later, the internet had taken all over the whole world by storm. So things can change. It's good to pay attention. Okay. Great. Okay, we'll go to the next one. I've been seeing more about post-relational databases and struggling with the idea. Will studying relational database theory and structure have some application to the logic of post-relational databases? I'd be happy to take that if you would like. Yes. Okay. They've been talking about post-relational for a long time. And there are things out there like object-oriented databases. There's certainly things for specialized applications like when you do a Google search, they don't use a relational database. They have their own thing to make things happen quickly.  No SQL. There's other things out there, but nothing seems to be bumping relational databases off its throne. I taught my first SQL class, which is what we use to work with relational databases in 1997. They created one for another community college, started teaching it, and it's still, I'm still teaching it and it's still a super popular class always fills up very fast. People need to know SQL and understand relational database as a base. So I would definitely get those skills first. And then, you know, look, you might look at others if you have a particular niche interest in something, but otherwise I'm not seeing any sign that relational database is going to be the throne anytime in the near future. Hey, thank you. We had a question about the recording and the content and we will be adding this recording to our channel on our playlist on YouTube for student services and outreach. So you can look forward to that in the next week or two. Do any of our attendees have additional questions? We do have a couple more minutes. I'd like to ask the panelists, are there soft skills or skills that are not, you know, specifically defined on this pathway that you'd like to touch on or recommend as far as, you know, non-technical skills that maybe students pursuing this pathway need to sharpen up or learn more about for success in this pathway? I would just share one bit of my experience through all these years. One thing I learned is that technology is never about the technology itself. It's always used for some kind of purpose. It's always applied in some kind of domain. So your strand, it's going to come not only from your technology skills, but also knowledge from a related field or related domain. So it's always used in some kind of combination. If you somehow can work out a combination of a subject area, a domain area, plus the technology skills that you can build in that web-track courses, then you will be better off. And Dr. Tucker? Yeah. No, I just echo what Dr. Lou said. I think in terms of soft skills, some of the most important ones are being able to work in a group because very little is done as an individual. And it's something I really emphasize in my classes is, and being able to work virtually, which our program certainly supports that, communication across time zone. There are fewer signals that you have to communicate and also to take advantage of tools like Zoom because every now and then I'll get a student project group and they say, well, we're just going to use Discord. We're not going to meet in real time. We're not going to hold any actual meetings face-to-face. And usually the work does not benefit from that. I mean, I think there's... And it's a skill that needs to be developed to understand what it means to inventory the skills of the group, understand what it means to kind of push your own boundaries and say, I really want to develop this skill of mine. And within a group project, that can be a way to do that. So I would emphasize that that's a super important so-called soft skill and empathy. I think empathy is... There's never enough of that. I totally agree with what you're saying there, Dr. Tucker. That in the real world, you might get to go off and work a little bit by yourself, but you're always going to have to work with a team just about any job I've ever had that involved that. And so the basic rules of be kind and be someone that other people would want to work with. Get along with people and those dynamics will go a long way towards making someone want to hire you. Yeah, be able to interact with the human beings and be able to communicate effectively with the human beings would be a great plus. And especially in a possible supporting role that we're going to play as a technologies expert. Yeah, excellent. Well, we have only a couple more minutes. If there are any final thoughts from any of our panelists, any specific professional organizations you want to put a shout out to or anything final thoughts, please feel free. The floor is yours. Well, I think going to conferences is really important. It's so nice that they're in person now. I mean, I've had so many things develop out of conference attendance that was not because I was at a session or giving a session or on a panel. It was just sort of these serendipity kinds of interactions. So if you can do it, I would really encourage that now. Yeah, definitely. I would encourage you all to learn about the new things, even just kind of shopping around in a conference to kind of stay on top of things. You don't need to become an expert. You don't need to dive deep. But just to get a feeling, a general, intuitive understanding of how things work would help you down the road. We're coming. It's always fun to talk about this profession and field lots of different areas. Thank you, everyone. Thank you to our three talented panelists. We're so lucky to have you here at the iSchool. So, so lucky. And thank you to our co-moderator Taryn. We will be rendering this recording and it will be available within the next few weeks on our YouTube channel. So thanks, everyone, for spending a little bit of their day with us today to learn more about the web programming and information architecture field. So take care, everyone. Have a great rest of your day.


What's up, everyone? It's your girl, Kenty here from Layton Sports Cards and I am ripping 2021 Penini Contenders Optics Football Hobby 10 box half case break number 15 random teams. Here's a look at the random results again. You can always find these at LaytonSportsCards.com underneath the results tab and link is also in chat for you. All right, here we go. Good luck everybody. New case. Let's see when we get out of this one. Got a Dalvin Cook rookie of tree sermon Niners. Got blue rookie to 99. Jacob Harris Rams and blue X's and O's to 99. Devin White and Tom Breedy. No buts. Oh, this one's cool. How about Super Bowl XL Heath Miller Steelers. Eric I. Nice Heath. And we've got to 149 on the red Amon Ross Saint Brown Lions. Little dimple roll there right next to his A. You can kind of see that on camera there. Small dimple. I think the the golden auto is that right there for the reasons which I need for sure. All right, CD lamb. Got rookie, Diami Brown, Washington, hollow rookie, Keeney and Wang Wu, Vikings and Green Pulsar, Josh Palmer and Diami Brown. Gonna roll the dice. One, two, three, top, four, five, six, bottom. That'll be for the rest of the break unless it's a one of one or an auto. That is a one. Gonna go to the top this time. Big palm in the chargers. Got to 99. Blue rookie ticket auto Richie Grant Falcons. And so 149 for the Bucks. Hollow rookie ticket auto Jalen Darden. Bucks. What's up, Randy? Hey, Randy. Not yet, Randy. No. I don't know if we'll see any either. I think that was a one time thing. Freak thing. Got Saquon, rookie Elijah Molden or Elijah Moore. Jets. We've got to 50. A orange de hop. Cardinals. X's and O's of Nick Bosa and Shreya Leeds for the Niners. Got to 99. Rookie ticket auto Chas Serrat Vikings. And Patriots. We've got rookie ticket auto Ramon Dre Stevenson on card. So she's E. She's QB now for you, huh? Oh yeah. A redemption here. Derek Henry. Sam Ellinger. Rookie Colts. That's just one. We've got red. Khalil Mack to 175 for the Bears. And orange round numbers. Devontae Smith and Jalen Waddle. This will go Eagles. That'll be to 50. 13 of 50 there. Redemption. Set that there. And to 50. We've got Ian Bulk. Rookie ticket auto. Nice. On the aqua there. And redemption. Good luck, everyone. We've got JC Horne. Rookie ticket autographs. Silver. Card number 144. That will be a Panthers hits. Panthers. Got Lamjack. Rookie of Devontae Williams. Broncos. We've got rookie ticket of Thailand Wallace for the Ravens. 10 of 13. That's a red, white, and blue. It's hard to tell with that Ravens purple. I was like, what color is that? Love the red, white, and blue mojo. Nice one there Ravens. Got optic illusions. Chargers. Justin Herbert. Not Phil. Justin Herbert. I don't know why I'm doing that all of a sudden. I've never done that before. We've got Cowboys. Rookie ticket auto, Jabril Cox. Cowboys. And to 10. Greg Russo. On the gold rookie ticket auto bills. No bills. First gold auto that we've seen tonight. First red, white, and blue. And first gold. Yeah. Nice. Starting your ceremony. We've got Tom Brady base. Ramon Dre Stevenson, Patriots. We've got hollow Jonathan Taylor Colts and up and coming DK Metcalf. Cool one there. That almost looked like a nebula for a second in the background. I was like, wait a second. We've got for the Pats Christian of Barmore rookie ticket auto. Patriots. And Colts. Hollow rookie ticket auto quitty pay. Colts. Another redemption coming up. Jonathan Taylor. We have Zach Wilson, rookie base jets. Hollow rookie ticket. Jamar Chase Bangles. And hollow Darius Leonard and Carson Wentz on the X's and O's. Colts. Got Washington hollow rookie ticket auto. Diami Brown. Washington with the combo spot. Lisa. And redemption here. We've got Caleb Farley. Rookie ticket auto. Titans. Titans on that redemption.  Mark Andrews. Rookie of Anthony Schwartz Browns. We've got to 50 rookie Tray Lance Niners. Nice low numbered one there. Trying to find out, figure out if that is a print line right there by his hip. It doesn't go all the way through. It looks like it's just right there.  Joseph I. Then we've got red, white and blue contenders. MVP Joe Scheiste. Four out of 13 bangles. Jason S. Sick hit there on the Joey B. Heck yeah, we'll mag that one for you of course. Got redemption. Then we've got two 30 green Pulsar rookie ticket auto. Tyler Wallace. Ravens. Nice hit. And redemption. Here we go. We've got not sure. Harris on the rookie patch auto. Nice. Steelers. Eric I. RPA there. That's why we haven't seen any Najee because he's a redemption. Man, come on Najee. There you go. Nice RPA there. Eric I. Are all RPAs numbered at 50? Not sure because that Mac was what just like a hollow face. Y'all have to look at the checklist on that one. Got Devontae Adams. Rookie Kyle Trask for the Bucks. Little indent on that card right down here. Kind of see it on on camera. We've got blue to 99. Terry McLauren and pink X's and O's. Tyron Matthew and Patty Mahomes to 75. And we've got Giants Rookie Auto Aziz Ajalari. Giants. That might be them. And we've got to 99. Chargers. Josh Palmer. Big poem. All right. We've got one last box here. Another something back here. Oh, that's sick. We've got Derek Henry. Rookie Amir Smith Marseille Vikings. A blue to a tag of Iloa to 99. And we've got gold. Dak, free of 10. Splitting image. That is nasty. Cowboys. Dallas is Nunzio P. Wow. That is so sick. So that fields must have been like a bronze scope. This is what the gold looks like. That is so cool. Mag that for the Cowboys. We've got Packers Rookie Ticket Auto. Kylan Hill. Nice one there. And sweet one here to finish it off to 50. Perennial Contenders Auto. Tua. Tag of Iloa. Boom. Even W. There you go on the Tua. Nice second year Tua there. 25 out of 50. We'll mag that one as well for you. Just a second here. And we will do every count. All right. We had Kylan Hill Packers. Josh Palmer. Chargers. Aziz Ajalari. Giants. Nashash. On the RPA there, Steelers. Tylan Wallace on the Green Pulsar. Ravens. Titans Redemption. Caleb Farley. Dami Brown. Washington. Quitty Pay. Colts. Christian Barmore. Patriots. Gold. Greg Russo. Bills. Jabral Cox. Cowboys. Panthers Redemption of JC Horne. Ian Book to 50. Saints. Ramon Dre. Stevenson. Patriots. Chess. Rat. Vikings. Jalen Darnon. Bucks. Richie Grant. Falcons. Amanra. St. Brown. Lyons. We had the Heath Miller. Steelers. And then our mags cards. We had the Perennial Contenders to 52. A tag of Iloa. The Gold. Splitting Image to 10. Dak Prescott. And the red, white, and blue MVP of Joey B. All right. That will do it for this break. We've got another half case coming right up.


Pentagon, 31 Abrams tanks already in Germany, Ukrainians to start training as soon as possible. The US Department of Defense confirmed the arrival of 31 Abrams tanks in Germany to train Ukrainian crews. Patrick Ryder, the Pentagon's spokesman, said it. I can confirm that 31 M1 Abrams training tanks have arrived at the Grafenwer training center in Germany in preparation for the subsequent training of Ukrainian tank crews. Those crews are expected to arrive and begin training within the next couple of weeks, he added. The Biden administration announced its intention to send the tanks to Ukraine in January. It took this step after months of insisting that the tanks were too complex and difficult to maintain and repair to encourage Germany to supply leper tanks. The United States has removed some secret technologies from the Abrams tanks it plans to send to Ukraine as it fears that they could fall into the hands of the Russian army on the battlefield. Earlier, Pentagon Head Lloyd Austin announced that Ukraine would receive the Abrams tanks in early autumn, at which time the training programs for the Ukrainian military to operate them should also be completed.