Sunday, December 30, 2018

Why I teach

I use Flipboard to consolidate news stories that I am interested in.  Of course, education and technology are two of the topics that are checked.  A couple of days ago, a story from the Wall Street Journal showed up in my feed: Teachers Quit Jobs at Highest Rate on Record.  The economy was one of the reasons listed -- teachers are receiving small or no raises and are finding better paying jobs outside of education.  And the story ended by quoting someone who felt that the American society does not value education and students -- and by extension those who work in education teaching students.

I certainly cannot fault a teacher for wanting a bigger pay check, and realize that there are many fields where teaching degrees and skills can be put to good use outside of education.  Working in the field for my fifth year, I am grateful for the skilled, energetic, and joyful teachers that work at my school.  Each of those educators has a unique reason for teaching and staying in the profession.  I have also been saddened to see some excellent educators leave the field.  There truly is a need for good educators!  As a result I want to add my thoughts about why I teach.

There are many well-written articles and blog posts about the reasons that people teach, and I am adding my perspective as someone teaching technology and teaching as a second career.  Over the summer I completed my training for a CTE endorsement and as a final activity, we completed a three sentence reflection activity on why I teach.  This is an expanded version of that reflection.

I teach technology because the future is now

When I was a senior in high school (1982-83) I took the very first BASIC programming class taught at my high school.  I was hooked!  That lead to a college degree in CS and Mathematics and a 26-year career at IBM.  Over that career, I programmed, trained, consulted, and ended in technical sales,
Placing that hook!
and along the way had the opportunity to live and work in Rochester, Minnesota; Guadalajara, Jalisco; and Denver, Colorado.  It was a long, wonderful career and I also had the opportunity to do some volunteer work with at-risk youth.  That volunteer work gave me the interest to move into teaching.

When I transitioned to teaching from IBM, I got my secondary teaching license in mathematics -- thinking that high schools would need multiple math teachers and few if any computer teachers.  I was pleasantly surprised to learn that teaching CS in high school is needed and in many cases with positions left unfilled.  Over the past several years I have gradually moved from math to computer science and have been delighted with the move.  Now I have the distinct privilege to introduce students to computer programming and hopefully hook a few more students to a career that I so enjoyed.

The CS field continues to grow, and so many other fields rely on or have connections to technology and coding.  I find myself excited about available careers in full stack web development, machine learning and artificial intelligence, cyber security, as well as the ongoing needs of operating system, middle ware, and business application development.  There are so many directions my current students can head, and I am envious of the future that they are headed into!

I teach high school because youth are our future

At times I am asked, do I miss IBM -- I worked with great people so of course.  Other times I am asked, wouldn't I rather teach at a community college or university -- there are definite perks to that.  However, teaching at the high school level is something that I am enjoying immensely.

In the Exploring Computer Science class, most students are placed in the class as a freshman or sophomore elective.  The students are very honest about whether or not they "like computers" and if they think that computer science is "too hard".  I do my best to show these students that technology in general and coding in particular can be enjoyable and something that is very doable for them.  Others feel that there is very little for them to learn in a CS class since they are already experts using their phones, getting around firewalls, and persisting with whatever the latest game is.

I walk the line between providing enough scaffolding so students thinking CS is too hard can feel comfortable finding some of those little used keys like (), {}. [ ], < >, &&, ||, etc., and keeping my advanced students challenged and extended enough to keep going and learning new things.  But at the end of the day, these students are going to be the ones designing websites, writing software, and running systems that keep society going when I am out of the working world and enjoying retirement.  I want this world to be running smoothly with all of the technological wonders continuing to flow in the future run by these students.

I teach with joy because attitudes are contagious

Honestly, this last reason for teaching is more aspirational than a statement that I can support on a daily basis.  I fully recognize that attitudes are contagious.  When I look at my coworkers I see the ones that are filled with joy every day.  Their energy is something that I want to be around and also something that I project -- on my best days.  Admittedly, I too often get frustrated with lessons that have gone wrong, students that aren't as interested as I hoped, and either the students or the teacher just having a bad day.

On the positive side, I feel that as a second career teacher, I can look at education with a wider perspective.  I know first hand the opportunities and the challenges that will face my students going into the CS field.  I also don't have the worries or the ambitions that teachers beginning a career in education have.  As the article I linked at the beginning of this post stated, there are many reasons that teachers leave the profession, and happily none of those apply to me.  I am happy with this field and the students I meet every day.  And that's a good thing, indeed.

* Images from pexels.com

Sunday, December 16, 2018

Web Design Reflections and Subgoal Labeling (Arrays)

We just finished the last week of classes at The Pinnacle and are headed towards finals week for semester 1.  My Exporting Computer Science students have turned in their final projects for the web design unit.  And my AP Computer Science students took their last set of notes on Arrays using subgoal labeling.  If you are mainly interest in subgoal labeling, skip to the end.

Web Design Reflections


This is the second year of teaching a 9-week unit on web design to the Exploring Computer Science class.  I was so impressed with the 3-4 page websites that my students produced.  Some students have a good eye for color and building a website with complementary colors that look good on a page.  They mastered building a set of web pages with a cascading style sheet.  The pages used a common grid layout and navigation bar to move between pages.  All of the students selected topics for their sites that were of interest to them.  Topics ranged from music to anime to sports, and as with all student projects they were of varying quality.

Here are some examples of their work:








Last year I was primarily focused on getting through the material (and honestly, making sure I fully understood how to use HTML and CSS).  This year I added additional opportunities to practice a skill before having students create a project.  As I look back at the end of the unit I am seeing places that need improving for next year.

Keyboarding

Many of the students taking this class do not have a great deal of keyboarding experience, and even those that do are not familiar with the keys needed for HTML and CSS.  So the first area that I want to add and improve on for next year is to have a section on finding some of those keys that are not often used in normal typing but come up frequently in HTML and CSS:

  • angle brackets for all of the HTML tags < >
  • slashes  used in ending tags / (and distinguishing them from back slash)
  • braces used in CSS files { }
  • semicolons used in CSS files for the end of each attribute ;
I was talking with one of our ESL teachers and she gave a great suggestion -- why not make a simple Google assignment where students type in the tags along with all of the special characters 3-5 times so they get accustomed to finding these little used keys in a separate activity.  Thanks Taniuska Worsham (if you are interested in learning about what she does teaching English as a second language as a second gig with VIP Kids check out this link and use referral code TANUI0001)!

Colors

I gave students a Do Now activity to look at the w3schools.com which has a great section on colors, color schemes and how to use the RGB values in a website.  Most of the students recorded a color scheme in their journals, but this Do Now was early in the unit and at that time they didn't have a good idea on how all of the different colors would be used in a website.  My thought is that students do need to have a lesson dedicated to selecting colors and that it should be near the end of the unit.  I think it will be a nice light lesson to put in between setting up a grid layout and before setting up a navigation bar.

Citations

Although we discussed citations in class, I can see from the final products that most of the students did not use royalty free pictures and did not provide citations to where they got their material from.  Similar to colors I have a note that I need to make this a full lesson as well.  Again, I think this will be a lighter lesson that can be inserted between some of the heavier HTML heavy lessons.

Grid Layouts


The section that caused the greatest amount of difficulty for students was setting up a grid layout.  For practice I had students add the text of a grid section to the HTML document and then practice adding a new section to the CSS file, changing the layout, and then adding in the text for the section to an HTML document.  The completion rate on this assignment was not 100% and it did show in some of the final products.  This lesson needs to be improved and I have added a note that I need to have a second set of practice exercises for this lesson.

Subgoal labeling (Arrays)

First, thank you to Alfred Thompson for giving me a plug in his very popular blog!  I was wondering why the readership of this little blog suddenly spiked.

My learning about subgoal labeling continues.  In the set of notes for Arrays, I continued to use the major labels at the top of the notes and then provide the subgoals in each section.  For this set of notes I repeated the subgoals for the second section and had students complete this section after following the steps with me the first time.

The students gave positive feedback that they liked the idea of having a practice on your own section before they were set loose on the practice on the labs.  The full set of completed notes are at this link.  As usual I give my students the file with most of the code removed and we write it together.

I continue to fine tune this, but feel that I have a pretty good format now.  Thanks again to the original CS ED Research conducted by Margulieux, Guzdial and Catrambone on Subgoal Labeling and Worked Examples.

Sunday, December 9, 2018

Subgoal Labeling (Part 3) and CS Ed Week

It was another busy week at The Pinnacle as we wind down the first semester.  Congrats to our Timberwolves cheerleaders who won the Colorado State 3A Cheer Championship!  The TSA (Technology Student Association) students learned about careers in Security from Aaron Goldstein of Tanium.  Then they competed in the second round of Cyber Patriots.

Subgoal Labeling

First, thanks much to the valuable input from Lauren Margulieux and Mark Guzdial, I am learning more and more about subgoal labeling as a means of teaching CS concepts.  Briefly, the things that I have learned:
  • subgoals are different than the high level goals of a lesson
  • subgoals should be very granular - associated with one or only a few lines of code
  • subgoals should be short and memorable
  • subgoals should be repeated
I am tackling the first two points in my next lesson on using the Scanner class to read files.

High level labels and subgoal labels

The first thing I have learned is that what I was thinking of as subgoal labels are more appropriately the high level goals or CS Concepts.  Subgoal labels should be thought of as the individual steps or lines of code to implement a CS Concept.  Subgoal labels can often be attached to a single line of code.  

This week my students were introduced to using the Scanner class to read files.  I continue to teach a lesson using a starter file with comments and as we discuss concepts we write the code together.  Here are the high level goals for the lesson:
/**
  * Using the Scanner class to read and parse Files
  *
  * In the past we used the Scanner class to read and parse input from the keyboard and Strings.
  * Now we will use the Scanner class to read and parse input from a File.
  *
  * 1. Review reading input from a String with a Scanner
  * 2. Read a File with a header
  * 3. Read a File without a header
  * 4. Read a File with lines of text to be parsed
  *
 **/

Subgoal labels -- the finer points

The lesson had three main goals.  Introducing students to
1) Read a file with a header such as the number of lines of data contained in the file. 
2) Read a file without a header record, meaning the code should check if there is more data, before reading a record. 
3) Finally reading a file that has multiple lines and each of the lines should be processed using a Scanner with a String as noted in the previous lesson.

Each of the goals contains multiple subgoals and these subgoals are typically one or only a few lines of code.   As an example the goal of reading a file with a header record begins with a subgoal of creating a File object to represent the name and location of the file.  Because my students split between using Notepad++ and compiling their code at the command prompt and using the Eclipse IDE some of the notes reference both of these.

// 2. Read a File with a header record

// 2a. Create a File object represent the name and location of the file
//     You do not need to specify the directory if the file is in the
//     same location as the Java class if you are using Notepad++
//     or current working directory if you are using Eclipse.
File fileName = new File("for.txt");

// 2b. Create a Scanner with the File object
Scanner file = new Scanner(fileName);

// 2c. Read the header record
int numLines = file.nextInt();


// 2d. Create a for loop from 1 up to the record header
int total = 0;
for (int i = 1; i <= numLines; i++)
{
// 2e. Read the other records in the for loop using one of the next___() methods
number = file.nextInt();

// 2f. Perform any processing needed
total = total + number;
}
System.out.println(total);

Things that still need to be improved

Some other things that were pointed out that I still need to work on.  First, is that the subgoals should be short and memorable.  I think this needs to be improved.  By nature I use many words to describe something and realize that to be memorable the subgoal should be brief.

Next I need to provide an additional example or two that uses the same subgoal labels so students can see multiple examples.  This sounds like a summer project to me!

For the complete set of code for this lesson click here.

CS Ed Week


CS Education Week came too quickly, and I didn't have time to get much done.  For me the first week of December is inconvenient.  Most of my classes are finishing off one last unit before preparing for semester exams, and taking some time out to do an extra task doesn't fit in well.  I would much prefer doing something in February for our eighth grade students as they are about to start signing up for their first high school classes.  And I think I may ask our Middle School if we can come back for day at that time.

Using Unity to add tiles to construct
a game.

Let's Play!


As a result, the Pinnacle had a small showing for CS Ed Week.  The students in Game Design were finishing off their 2D Platformer games using the Unity 2D Game Kit, so I had the students show off the Unity Game Engine to a group of our sixth grade students.  Then the students got to play those games.  It was a fairly small effort that didn't impact many students, but we did leave the sixth grade class with some ooh's and ahh's and a couple of students asked what class they should sign up for in high school if they wanted to design games, so I called it a success.

Sunday, December 2, 2018

Subgoal Labeling - Revisited

Assorted Clothing Tags
Labeling Christmas gifts and steps for using the Scanner class.

The first week back after fall break is always a scary thing.  How many students have used the one week off to purge their mind of almost everything they have learned?  I decided to start the first day back with a review day for most of my classes and was very happy I did.  That refresher is helpful for everyone!

As I start to buy Christmas presents and attach the name cards, I am reminded of how important labels are to sort out Christmas gifts and also to label steps in learning a new CS concept.  So I am returning to what I am doing with subgoal labeling in my AP CSA class.  At its most basic the way I implement subgoal labeling is by creating a numerical list of the steps to teach or implement a new concept in Java.  It seems very simple, but it makes for a good way to go through a lesson.

Subgoal Labeling


I blogged about subgoal labeling and worked examples a few months ago.  The concept seemed very basic but it was not something I was doing in my course.  I dabbled with it a couple of times, but now have started using it consistently for my notes.

The way I have students "take notes" for my AP CSA class is by coding together.  I provide students with a skeleton file with comments that describe what we will be doing.  To implement subgoal labeling, the notes are now numbered.  To demonstrate how I subgoal label, let me give you the three steps that I follow for my notes with subgoal labeling.

1. The notes begin with two statements:  "In the past we...." and "Now we will...".  These statements tie the concept that we are learning to things that the students have already learned.

2. Then the notes have the list of steps that we will follow for the day.  The notes begin with a step or two that are review and then move into the new concept.  As an example here is the block comment at the beginning of the notes from last week's lesson on using the Scanner class with Strings.

/**
  * Using the Scanner class to read and parse Strings
  *
  * In the past we used the Scanner class to read and parse input from the keyboard.
  * Now we will use the Scanner class to read and parse input from a String.
  *
  * 1. Review reading input from the keyboard with a Scanner
  * 2. Review reading a line of input from the keyboard with a Scanner
  * 3. Create a Scanner instance with a String
  * 4. Parse integers using the Scanner class
  * 5. Use a delimiter other than space to separate tokens
  *
 **/

3. What follows in the notes is an expanded version of each of the steps along with code.  I typically provide all of the code for the review steps and leave blanks for the steps that are new for the lesson.  In the example above steps 1 and 2 were review and the code was provided.  Steps 3-5 were new material and the comments were in place but the code was not and we wrote the code together.

4. As a final step I typically go back to the beginning and review the steps.  The comments range from "Yes, we're done!" to "Oh, that's it?".  This method seems to me to be one of the basics of presentation -- tell them what you are going to say; say it; tell them what you said.

I will be taking a survey at the end of the semester, but so far, I feel that this is a good way to teach concepts and it provides students with a set of notes to go back to.  They can quickly review the top set of steps and look at the details if needed.

I would welcome input on whether or not I am getting this correct as far as the intentions for subgoal labeling and worked examples.

Completed Example


At the end of the lecture, here is the code that students will have in place.  If there is a day when I can't be there I can provide the worked example of notes.

Here is the completed set of notes for using the Scanner class with Strings:

import java.util.Scanner;

/**
  * Using the Scanner class to read and parse Strings
  *
  * In the past we used the Scanner class to read and parse input from the keyboard.
  * Now we will use the Scanner class to read and parse input from a String.
  *
  * 1. Review reading input from the keyboard with a Scanner
  * 2. Review reading a line of input from the keyboard with a Scanner
  * 3. Create a Scanner instance with a String
  * 4. Parse strings using the Scanner class
  * 5. Use a delimiter other than space to separate tokens
  *
 **/
public class Unit12Notes
{
public static void main(String args[])
{
// 1. Create an instance of a Scanner and read input from the keyboard
Scanner keyboard = new Scanner(System.in);
System.out.print("Enter an integer: ");
int number = keyboard.nextInt();
System.out.print("Enter a word: ");
String word = keyboard.next();
System.out.println("The number is " + number + " and the word is " + word);

// 2. You can also read a line of input from the keyboard up to and including the newline
keyboard = new Scanner(System.in);
System.out.print("Enter a line of input: ");
String line = keyboard.nextLine();
System.out.println(line);
System.out.println("word");

// 3. A Scanner can also be created with a String.
//    Instead of reading input from the keyboard, the program 
//    reads the input from the String
Scanner chop = new Scanner("12 5678");
number = chop.nextInt();
System.out.println(number);
number = chop.nextInt();
System.out.println(number);

// But Java throws an exceptions if there is no input
// uncomment the following line of code and run the program to see the exception
//
// number = chop.nextInt();

// 4. With the keyboard the input was limitless, 
//    but udinh a String means there is a limit to the input.
//    This means we need to check if there is more input using the hasNext() methods
//
//    This is a good way to "chop" up or parse input,
//    we can loop by first checking if there is more input
//    as long as there is more input, keep reading in the next integer.
chop = new Scanner("12 13 14");
while (chop.hasNextInt())
{
number = chop.nextInt();
System.out.println(number);
}

// 5. A space is what separates the numbers above
//    We can use a separator or delimiter other than space using the method useDelimiter()
//
//    We can use this to read in integers, doubles, and even Strings within a String
chop = new Scanner("Washington,Adams,Jefferson,Madison,Monroe");
chop.useDelimiter(",");
while (chop.hasNext())
{
word = chop.next();
System.out.println(word);
}
}
}