In the mean time, the Kahn Academy has taught us that 10 minutes seems to be the magic number for online tutoring videos, after that people find it too unwieldily. Thus, I re-did all the videos for this semester. Now I have about 60 Java (and eclipse) tutorial videos. Youtube is gathering data on views. Let's see what happens.
Jose M Vidal
Putting the magic in the machine since 1980.
Friday, January 20, 2012
Java Tutorial Screencasts
In the mean time, the Kahn Academy has taught us that 10 minutes seems to be the magic number for online tutoring videos, after that people find it too unwieldily. Thus, I re-did all the videos for this semester. Now I have about 60 Java (and eclipse) tutorial videos. Youtube is gathering data on views. Let's see what happens.
Sunday, June 12, 2011
iPad App for Taking Surveys
I've been playing around with mobile webapps and JavaScript toolkits like Sencha touch and jQuery mobile. With all the news about native iphone apps, a lot of people forget that one can easily build iphone/ipad webapps that work offline and let you bypass the Apple store (so, no waiting weeks for approval, just upload it to your own website).
Dr. Jim Thrasher, from the Arnold School of Public Health, asked me to build an iPad app for his survey-administrators to use in administering surveys. The iPad is used to randomize questions and store all the survey answers, which are later uploaded to the server, when an Internet connection is available. The server is a google appengine web app.
Lessons learned:
- Offline webapps are possible (almost too easy) on the iPad/iPhone. But, I had to train the users on how to clear the Safari cache whenever I put out a non backwards-compatible version.
- A JavaScript toolkit like jQuery mobile or Sencha touch is needed for all its widgets. We need more widgets: this is probably the biggest current limitation.
- My app auto-downloads and installs the latest version the moment it is run, kinda like Chrome, thus enabling a fast development cycle.
Friday, May 6, 2011
A Webapp for Turning in Programming Homeworks
Since I had to grade about 20 programs every week and since these howeworks were webapps themselves that would be posted on some website that I could test, I figured that best way would be to have a pastebin-like app that allowed me to view all submitted homeworks. No such thing existed so I built one and called it i-am-done.
I used it last semester and it works very well. I allows one to:
- create a class, and homeworks for it, giving each one a due date,
- get a simple URL to give students for turning in programs for that homework,
- view all the submitted howeworks for each student, in nicely colorized code thanks to prettify,
- students can upload and delete any number of files associated with a particular homework but, of course, they can't see anyone else's homeworks.
It is like a paste-bin where only the person that created the class can see the code pasted under that class. I have placed the code here in case someone wants to make a fully featured system out of it. I would loooove to see that.
Web Applications: An Undergraduate Class
Yet nother semester of teaching web application development has passed. This time, finally, I had a significant number of students (30) signing up although, after it became clear this was a programming class, fewer (17) remained. This is to be expected as programming takes time and not everyone has the means.
A few interesting tidbits I found.
- Most undergraduates know little about web technologies. I kinda assumed that because they grew up with the web that they would know the difference between a GET and a POST, but no. There is a large knowledge gap to be filled in. Luckily, these are easy things for them to learn.
- There is a steep learning curve to developing modern web applications, and it keeps getting steeper every year. A lot of complex technologies that must be mastered: HTTP, HMTL, CSS, JavaScript, Databases, Ajax, jQuery, JSON, Cookies, Firebug, functional programming, REST, event handling, asynchronous lambda functions, the browser's loading orders, etc. (oh, and Python) One semester is only enough time to introduce a student to most of these, but not all, and mastery will require more time spent programming than is afforded. Still, a lot can be learned in one semester.
- I am sure some hated that we had 13 weekly homeworks, each one a significant programming project, but there really is no other way to learn all this stuff. It is one thing to read about Ajax, actually implementing a webapp that does it is a completely different matter.
- Its all about the JavaScript: Facebook moved to a JavaScript SDK in their platform, Google is using JavaScript as glue to for their 'apps enterprise', and node.js has gotten really popular. With jquery and firebug (or chrome developer tools), JavaScript is a lot of fun to learn and debug. However, its tricky to figure out the timing on how various parts of a page are loaded by the browser and, even harder, how to decide what code goes in the server or the browser, not to mention JavaScript's many many quirks.
- The google app engine works as a learning platform. It is minimal, reliable, and on the web (not on the student's laptop) so we all can see what we all have done.
Onward.
Thursday, March 10, 2011
On Teaching Programming in the Age of the Web
In the last few years a lot of people have been pushing the idea of 'flipping' the classroom experience: have the students view online videos as the homework then use class time for one-on-one help, see, for example, Kahn's video below. I agree it's a great idea, and there is data to support it, but can we do that when teaching programming to University students?
In the last couple of years I have tried to do this for two of my classes. My CSCE 145 is our introduction to programming class. It is taken by both computer majors and non-majors, about 50% for each group. My section alone had about 60 students. I created some Java programming videos which the students could watch at their leisure. With about 60 students, personalized in-class help was not possible, also because the classroom had no computers and the vast majority of students do not lug around a laptop all day with them. So, instead I decided to make the lectures more of an interactive demonstration: I would solve some programming problems in front of them and stop often ask them "how do you solve this?". The class also had a couple of weekly labs where the 60 students were broken up into more manageable groups and the TA's gave them individual help on the programming problems. I learned a couple of things.
- The videos were watched by about 2/3 of the class. From the surveys I gather that the students that did not watch them where those who already had programming experience; they didn't need them. Thus, the videos were a success, mostly. Looking at the logs I see that the first video was watched the most, then the second one, and so on. So, some students stopped watching. I think I made the mistake of making them about 40mins long each (I wanted to cover 1 chapter in each video). Next time, I will follow Kahn's lead and keep them under 10 minutes and limit each one to more specific topics.
- The lectures, in which I do a sample programming problem, seemed to be well received, but attendance was still just around 50% (students did not get penalized for not attending lecture). I think it would be more effective to get rid of lectures completely and have more labs, but this would mean I would have to spend 24 hours/week just in lab (12 hours/group with 2 groups of 30 students), so it becomes a significant time commitment. Add to that the time I spend making videos, tests, and homeworks and it quickly becomes 40 hours/week for just that one class. I think a more realistic solution is to pay some of our A-level Seniors to do some of that coaching, but we don't appear to have that kind of money right now.
- IM works really well. If you to the class blog you will see the "Chat with Jose M Vidal" button. This, along with a pastebin were very useful. For whatever reason, students will not email me their questions, but they will hit me up on the IM. This was a great way to offer when-needed help. At this level students often get stuck with a simple problem, like a missing semicolon or a variable defined in the wrong scope. A student could spend hours trying to figure this out while I can just look at it and in two seconds solve this tiny bug so they can move on rather than giving up out of frustation, which is what many times happens (and then they drop out). With IM they could just send me their pastebin link and I could solve their problem, any time during the day. The only problem was that our schedules are rather off-sync: I sleep from 10-6am while they appear to sleep from 2--10am. Luckily, my TA was able to pick up the night shift.
In my CSCE 242 class I am teaching web applications which is a topic for which there are a lot of online instructional videos. The problem there is choosing which of these videos are good, and deciding on which ones to show at which time. Since this is a software development class, I structured as very heavy on the programming. The class consists of about 13 programming homeworks that, more or less, have the student build a modern complex web application. The class is not yet over, but already I see that:
- IM has been even more useful in this class. I get at least a couple of question every day.
- The best help is context-sensitive. Complex programming ideas are easier learned in context. When I grade one of the homeworks and I tell the student "I see how you did this, and it works fine, but look at this other way of doing it. Isn't it soo much simpler?" the lesson is readily learned. At least, that's how it seems to me. I wish I could get some data on this.
Going forward I hope more people like Kahn step up and produce more of these videos. In fact, I want to see better videos with animations, professional voice-overs, professional writers, etc. These videos will be our new Public Library. They will allow me to focus on proving the context-sensitive help that students need. I also see that teaching will continue to move away from 9-5 and become more of a 24/7 on-call type of job. Hopefully, we will have shifts!
Tuesday, December 28, 2010
Sending Emails from a Google Spreadsheet
I have been using Google Spreadsheet to keep my class grades for a couple of years. It has several advantages over the PC version:
- I can share the spreadsheet with my TAs so they can enter grades for their labs. We are all always on the same page.
- Google spreadsheet keeps track of all old revisions, so if any one of us makes a mistake we can always go back to see what the original grade was.
- It is trivially easy to create a graph of the grades and post a link to it on the class blog. The graph gets updated automatically as the grades change.
However, one remaining problem was how to give each student his grades without revealing all the grades, which our university frowns upon, even if the names are not posted. The clear answer is to email each student his own grade.
Luckily, Google has a cool feature called Google Apps Script which lets one write JavaScript programs that can access the data on a Google doc and do things like send emails. So, I wrote a short program to automatically send each student his grades.
Installation
To use it you must first set up your grades spreadsheet to look like this one. Note that
- the first row has a 'name', 'email' and other columns for each item,
- some columns have the same name as other columns, but with ' Comment' appended, for example: 'Test 1' and 'Test 1 Comment', the comment columns contain any comments you want to give the student
- the sheets are named 'grades' and 'template'
- the 'template' sheet contains the template information for building the emails (your message).
Once you have the spreadsheet built, go to 'Tools -> Scripts -> Scripts Editor and cut-and-paste the emailgrades.js script in there. Save it, then close and re-open the spreadsheet (or, run the onOpen method if you know how to do that). You should now see a new menu item on you spreadsheet called 'Class', as shown in the screenshot.
Usage
The 'Send Emails' item will send each student (row) his grades if you choose it when you have no cells selected. If you first select (light blue background box) some cells in the spreadsheet then it will only email the students in the selected rows. You can verify that the emails have been sent by going into your gmail account and checking the 'Sent Mail' folder. It can take several minutes for the emails to start appearing so be patient.
The 'Preview Emails' item is mostly for debugging. It will show you a preview of two of the emails that send emails would send. The 'Show Email Quota' item tells you how many more emails you can send today. Google limits scripts to 500 emails per day to keep spammers from abusing the system. Since my classes have at most 60 students this has not been a problem for me.
If you have any comments, bug reports, or feature requests please post them below.
Friday, June 18, 2010
Resiliency in Supply Chain Networks
Andrew presented his paper titled A Practical Multiagent Model for Resilience in Commercial Supply Networks at the latest Agent-Mediated Electronic Conference. He implements a model which generates supply chain networks based on a well-known model from management theory, so the networks' topology should match real world networks, and then examines the resiliency of the resulting networks. The results are not surprising in the general sense (more connections mean more resiliency) but they do give us a quantitative measure of network resiliency.
Below are the slides from his presentation:
Friday, May 14, 2010
Software Engineering Projects
I am often surprised at what a small group of our Senior Computer majors can accomplish in one semester, while taking four other classes, looking for a full time job and, in many cases, also working a part time job. But, they do some pretty amazing things in my CSCE 492 class.
The first group this semester decided to build an iphone app. None of them had any experience with the Mac, or objective-C, or the xcode IDE, nor did any one of them even own a Mac! Still, none of this matters much. They quickly came up to speed on objective-C (which has similarities to many of the languages they learned in other classes) and managed to build a game that is better than many of the games in the app store. I expect their skills will be much in demand. In fact, I know they are.The second group built a Ruby on Rails applications that interfaced with the Amazon and the Facebook API's and used mysql, jQuery and had other javascript niceties. Only one of the students had experience with Ruby on Rails, and none had used web APIs before. It was another large learning and doing experience.
Still, aside from the technical knowledge they acquired, what they always tell me they learned most is how to work in a team and coordinate their time so as to get large projects like these done. That is not something that can be learned in a lecture.
Friday, May 7, 2010
SeaPort Container Terminal Simulation
Next week I will be presenting our (with Nathan Huynh) paper on agent-based seaport container terminal simulation at the workshop on agents in traffic and transportation.
Basically, we used netlogo to build a simulation of a container seaport terminal, like the one you see on the photo. We focused only on the decision-making process of the cranes. Those large cranes you see have to pick up the containers and place them on the trucks as they arrive. Since the cranes are slow and there are many trucks the crane operators have to trade-off several competing interests when making their decision: trucks want to get out of there as quickly as possible, it takes the crane a long time to travel the length of the seaport, the port manager wants to maximize the number of trucks served but without making any one truck wait too long.
In this paper we tried the more obvious utility functions to see how they performed in a seaport with 2 or 3 cranes. The utility functions used are:
- distance-based: roughly, go to the nearest truck, but avoid getting on the way of the other cranes,
- time-based: roughly, serve the trucks on a first-come first-serve based, while trying to stay out of the way of other cranes,
- a mixture of the above two.
Test results showed that the distance-based won, by a lot. It won not only on the throughput, as it obviously would, but also on the fairness measures, which is not so obvious.
I'll be putting up the netlogo model on my MAS Netlogo models page soon. The slides from the talk I'll deliver on Tuesday are below:
We are currently working on expanding this model, both from a programming, simulate more parts of the supply chain, and the analysis side, put some bounds on the solution quality that can be achieved assuming local control and local information.
Saturday, April 17, 2010
What We Should Teach IT Students
For readers new to the field, enterprise developer is just a type of job. The easiest way to define the term is by pointing out that Blue Cross Blue Shield and Bank of America hire "enterprise developers" while Google, Microsoft, and Valve hire "software engineers". That is, enterprise developers write the software that makes the business run smoothly—process insurance claims—while developers write the software that IS the business—the new version of Windows. From an accounting point of view, enterprise developers are often a cost center for the company while developers are a profit center.
Still, the recommendations are largely applicable to all. He recommends students learn:
- Source control
- Bug tracking
- Compiler (paying attention to the error messages)
- Make and the philosophy of repeatability
- Lint / splint or similar static code analyzers
- Serious editing
- DRY: Don't Repeat Yourself
- Defensive programming
- Maintenance: working on other people's code
- Manual testing
- Automated testing
- Efficiency and why it does not matter
- Thinking about the: business, project, release, deadline (getting the bigger picture)
- Teamwork: work well with others
Some of these, however, I think must be left mostly to the student. I know that learning to use the editor is super important, but I don't think we need an actual class to teach editing! I really can't see myself standing in front of our students for a whole semester telling them "To compile your code, press F8; to indent your code press Ctrl-A then Crtl-I". They know they can just get the list of shortcuts and memorize the ones they need. Still, I do make a point in my classes to stop and explain how I got System.out.println to appear after just typing sysout. Similarly, learning to use a source control or bug tracking system is just not that hard (compared with, say, implementing a compiler). Overall, the students who have not learned to use their editor, or understand compiler errors, or DRY, are generally the few who really don't care about programming, and their grades show it.
Still, I agree that these are all important skills to have.
Andy also said all students should have read Code Complete, which is the required textbook for my 492 class. He also mentioned The Pragmatic Programmer which is also a personal favorite of mine and on my list of recommended books for 492. Of course, we all know they are good because stackoverflow says they are.

