Monday, December 09, 2019

Coding Without a Net

My Programming Honors students are struggling with creating classes in C#. They really wanted me to code up a project live (again) and have them follow along. But I’ve used my usual examples and samples and projects already. First message is that I need more but I had to come up with one for today. And I had writers block. About a half hour before class, with a bit of panic setting in, the other computer teacher suggested a reindeer class. For Santa’s sled. For data use a name, their position on the sled, and if they have a red or black nose. Ok a bit of a goof perhaps but simple and seasonal. Why not?

Now I don’t know about you, but I prefer to write demo code several times before writing it again live in front of an audience. Not an option today but how hard can it be? I’ve written classes many times before and my content knowledge is solid.

I honestly hoped I would make some mistakes. Hopefully the students would catch them. Great learning experience. And yes, I did make a couple of mistakes. I forgot to make the class data private right off the bat. I called for a string parameter in the constructor that should have been an integer. A student caught that one. Winning!

The hardest part for me is that I had only thought through writing the class but now how to test it. I had thought about the constructor (and prepared a data file with 8 normal reindeer and Rudolph) and using ToString (overridden of course) for testing purposes. I had to make up a test for various other properties on the fly. At least that meant students got to see/hear my design thoughts as they happened.

  I’ve also been thinking about a Santa’s sled class that would have an array of reindeer objects. That might be fun if I figure it all out.

Things went pretty well actually. I got a lot of ideas which doing the demo and I’ll be more prepared in the next semester. I need to come up with something seasonal for the spring though. A prom dress class perhaps?So many ideas.

Wednesday, December 04, 2019

Coding for Fun and Advent of Code

My friend Mike Zamansky is a big proponent of the Advent of Code – 25 days of coding problems leading up the Christmas. Since I have been thinking I want to write more code for my personal enjoyment I started in on it myself. Day 1 and Day 2 were interesting (to me) problems and I enjoyed doing them. Day 3 didn’t appeal to me. It looked like something I would want to be paid to write so I didn’t do it. Day 4 looks interesting so I plan on taking it one some time today. After all, it is not coding for fun if it isn’t fun. I’m not looking to prove anything to myself or anyone else at this point in my life. Mike has been blogging about the problems he has been doing from a teacher’s perspective. I highly recommend his commentary

The Day 2 problem was particularly interesting to me though. It is a very simplified computer simulator. Only 3 instructions – 1 for add, 2 for multiply, and 99 for halt. with each of the first two operators having three parameters – location of the two numbers to operate on and the location to save the result. It is potentially self modifying code if any of the addresses points to an operator later in the list of instructions.

The obvious enhancement is to add more operators – division and subtraction for sure. Having a set number of parameters makes things easy so having variable numbers of parameters adds some complication. The more I thought about expansion the more I found myself contemplating a more complete “assembly language” especially as I found myself thinking about literal data and pointers as different types of parameters. Maybe I spent too much of my career writing in various assembly languages. In any case, as a thought exercise I found myself going far beyond what I would want to assign to a beginning programmer.

So I am pulling back a bit. I’m thinking about several smaller pieces. The easy part of a simulator with a few more operators. But maybe, also, what would a compiler look like that would create input for such a simulator? How would it load data into appropriate places? That’s a more advanced project but maybe something for me  to write to make it easier to create input for the simulator?

If nothing else, looking at Advent of Code is giving me ideas for both students and myself. Now that is fun.

Monday, November 25, 2019

What’s In A Name?

Naming things seems to be a continual problem with programming students. I’ve written about this before (two years ago A Rose By Any Other Name Gives An Error ). I can’t seem to get a handle on it with students. I think part of the problem is that students are good with ambiguity and inference. If you call a student by the wrong name or a diminutive they don't’ use themselves you may get a correction (think warning in computer speak) but they know who you are talking to/about. Compilers are a lot more fussy.

Case-sensitive languages differentiate between “question” and “question.”  Forget about adding extra letters or misspelling a name.

Somehow students have trouble looking that closely at words. I’m not sure if that is because they are too used to filling in the blanks of misspelled words or something else? I do notice that I see a lot of typos and spelling errors in other written work they do. Even though there are spell checking tools built into editors.

Part of the problem may be error messages. Well, that students don’t always read the error messages is part one. But even when they do the messages are not always helpful enough. “Variable does not exist in current context” is pretty meaningful for an experienced programmer. We understand things like scope for one thing. We also know to look for spelling differences. Students sometimes have trouble parsing that all out though. It is something that comes with experience.

Unclear error messages have long been a problem. I think that maybe it is because the people who write the messages have too much knowledge and so assume too much knowledge on the part of programmers. Then again most development tools are designed for experienced programmers and not beginners.

I wonder if smart IDEs will one day help beginners. Perhaps artificial intelligence modules will look at code and ask “Did you mean ‘Question’ and not "’question?” or “did you forget to declare this variable?” Or even “this variable is outside the scope of where it was declared.” This is the sort of hint that teachers give now.

All in all I think the answer is to make the tools more relatable to the people who use them. Teaching computers, which can be very difficult, seems, some days, to be a lot easier than teaching high school students.

Friday, November 22, 2019

Coding For Fun

As with so many things, it started with Doug Peterson. Doug recently posted about something called 100 days of code. This got me started about the need I feel (some times) to do more coding for fun. Or at least coding projects for my own interest and not for “work” purposes. Next up was Mike Zamansky (yet another good idea fairy whose blog I follow) Mike posted about some text based projects he was introducing to teachers during some professional development he has been running. Links below.

Now I love messing around with textual data. Love it. And I’d been thinking about that already and posted about one project recently. Mike’s most recent post reminded me of something I did “back in the day” when we used markup languages to feed into word processing systems (i.e. before WYSIWYG editors) I created my own concordance of the Bible. It was pretty cool to be able to do something like that. I may have to look for tools to do something similar. Maybe with HTML? We’ll see.

I also have a number of “things” that can be programmed sitting around at home.

The trouble is time. Well, honestly, not so much time as prioritization. There are other things to do. School stuff for example. Grading, lesson planning, and all that. And home stuff like the tables I want to build and the hydroponics system I have the materials for but haven’t built yet. And books to read. I need to be exercising more. And, well, you get the picture.

I suppose I could be coding and not writing this blog post as well. Sigh. I wonder if I wrote a scheduling app to help me out?

How about you? Do you code for fun or for learning (which is fun too) or is coding not part of your definition of fun? IF you do like to code how do you prioritize it? Does 100 days of code appeal to you?

Related Blog posts:

Thursday, November 21, 2019

Teachers Helping Teachers For Free

I understand the appeal of sites like Teachers Pay Teachers. Really I do. Some teachers are awesome at creating resources and the idea of getting paid to share them is attractive to underpaid and over worked teachers. Even Amazon, never one to miss a chance to make money, is getting in the business of supporting this idea (Amazon Starts Marketplace for Teachers to Sell Online Educational Resources) . For some reason the idea of asking poor under paid and under resourced teachers to pay for stuff that I have developed for my own use just doesn’t feel right.

I have no problem with teachers who decide to ask other teachers to pay for resources. I have no problem with people who make creating and selling resources in order to make a living. It’s a free country. I hope they have no problem with me giving stuff away for free.

I made a comment to this effect on Twitter and Mike Zamansky replied with “When I was starting out I only survived by the good graces of more senior teachers who mentored and just as importantly SHARED materials (free of charge). This shows the disconnect between capitalists and educators.”

I think that has been the experience for many of us. We survived and continue to survive because others share resources with us.

I’ve been pretty lucky myself. The first real resource I shared online was a pair of project books for Visual Basic and Visual C#. I got paid to write the first editions. By Microsoft not by other teachers. Teachers got them for free. I subsequently updated and expanded them several times as the software was updated but while the books were still free I no longer got paid to write them. I was and am ok with that. I got plenty of use from those projects myself. The feeling of helping other teachers is a reward in itself.

In full disclosure, I have a couple of self-published books on Amazon now. Mostly because creating hard copy books to give away is more than I can spend. But I haven’t turned down teachers who request PDF versions.

I have also benefited from resources shared by others. PowerPoint presentations, video demonstrations, project ideas, and a host of other resources that people have shared over the years have greatly benefited my teaching and learning.  I am very grateful for those who have generously shared those resources.

One day maybe teachers will not be under resourced and under paid. For now though far too many are. That’s why I think we should do as much as we can to support each other.

Wednesday, November 13, 2019

Not Too Easy and Not Too Hard

We’re covering Classes and Objects in my Programming Honors course this week. Specifically we are learning how to program classes in C# and use them in programs.  The struggle for me is to come up with classes that are interesting to students, practical for them to use, and not overly complicated. This is not Advanced Placement computer science A and we don’t have a whole year for the course.

I start with a simple Dice class. Easy enough as an introduction . I also live coded a Coin class. The difference being that I added images to the coin class to show them that more interesting objects can be used in classes. So what next?

Things I have used in the past include a playing card class. Interestingly enough this has had cultural implications. I have international students who are not always as familiar with American playing cards. But it works. There are a lot of pieces to playing cards and you can do them simply (face value and suit) or complicated (Face value, suit, nominal value – face cards are 10, front and back images, suit color, text names, etc) Methods and constructors can get interesting to say the least. So can creating programs to use the “cards.”

I tried a Pez dispenser class once. I do have a 12 inch Pez dispenser on my desk after all. I’ve done it the simple way with just a capacity value and a current count value. What I would really like to do is use a stack in the Pez dispenser class and have candy objects to put in it. If I were teaching APCS A and had time to cover stacks I would do this for sure. But I don’t.

I’ve thought about revisiting some of the class projects from prior AP courses. Anyone remember BigInt? I kind of liked that one. I did more with the Marine Biology Case Student but my students never really liked it. They called it the DAF – Dumb Ass Fish case study. Both may be a bit much for the time I have though.

I had some fun with a quiz question class last year. Data included the question, an array of possible answers, and an index of the correct answer. I liked that for showing how flexible array parameters could be. A true/false question is just a question with two possible answers. The next design question is of course do you have a simple array of questions or do you design a quiz class? If a quiz class, what does that even look like? Might be fun the have students try that design.

I’m still playing with more ideas. I’ll have to use something tomorrow but maybe the good idea fairy will hit before Monday. Suggestions anyone?

Friday, November 08, 2019

Define Better

Someone posted an interesting question on Facebook.

Is using ++i(pre-increment) better than i++(post-increment) ?

My reply was to ask for a definition of “better.” The Facebook posts have a lot of answers from people who appear to not have written a compiler themselves and who making a lot of assumptions. But the point of this post is not to discuss which option is better for some nebulous definition of “better.” Rather is is to think about asking the question of what do we mean by “better?”

There are a lot of what I call religious arguments in computing. Tabs or spaces, curly braces in columns or have the open on the end of a line, what is the best programming language, and on and on. Most of them stem from differing definitions of “better.”

Sometimes things matter very much at one point in time but not at all later and yet the bias from early days remains. There was a time with memory was so tight that a single character variable name was much preferred to a longer more descriptive name because of the space used. Most of my readers probably don’t remember those days but I do. Fortunately I recognized when the change happened. Not everyone did so quickly.  This is possibly at the heart of some of the tabs vs spaces argument for at least some old timers.

Other issues have become moot or mostly moot because we have so much smarter compilers and interpreters these days. We have long been at the point where compilers write better low level code from high level code than even the best assembly language coders. I seriously doubt that there is a difference between the code generated for ++i or i++ as the incrementor in a for loop these days. Compilers are too smart for that. Compiler writers think long and hard about those sorts of things.

How doubly dimensioned arrays are declared used to make a bigger difference than it does today. I can remember thinking long and hard about how to declare and iterate through two dimensioned arrays. You pretty much had to know how the compiler would allocate memory and what cache would look like to get optimal performance. I don’t think many people think about that today except for the most performance critical applications. Applications we don’t give to beginners anyway. Compilers do a lot of optimization on this sort of process so we don’t have to think much about it. Artificial Intelligence and machine learning (see also AI-assisted Programming) are probably going to make compilers even better than they are today.

Today I think “better” in terms of programming should mean “easier for programmers.” Easier to write, easier to understand, easier to modify, and to allow programmers to think about the end result and not the assembly/machine language generated.  Let the software do what software is good at and people do what people are good at.