So I'm going to throw this out there to my colleagues with more miles down this road than I have. I'm wanting to craft up a "language agnostic" list of core concepts and key terms for computer science, mainly because I want to develop some kind of "mastery" checklist or scale scoring, reminiscent of what the typical kindergarten progress report looks like. You know, the ones that have a list of things like "can tie own shoes", "counts 1 to 10", and so on. I know this kind of list would look different and be more lengthy as a student progresses beyond beginner level, but I'm aiming for what the foundation should be, regardless of programming language or platform.
The items that pop to mind for me, in no particular order, are:
loops (for, while, chained, nested)
I'm sure I'm leaving something out of these concepts, and this list doesn't have the key terms that would be much longer I'm sure, but hopefully this is a start of a good "core". The one thing I think is tough for my Intro kids (mostly freshmen) is getting them to understand this isn't something that you just observe and memorize to regurgitate back - putting these concepts into use requires actual understanding and higher level thinking! Oh, those freshmen...
I was having a conversation with a CS teacher in a nearby district, one who has more years teaching CS than I, and someone I respect greatly. We were discussing the pros and cons of starting with block based programming, in this case, App Inventor in particular.
He mentioned how he at first was kind of dismissive of block based programming, because he didn't view it as "real" if you were having to tangle with the syntax and all the other hurdles of a text based language. But as he has actually used a block based platform for the first time this fall he said he was having some interesting thoughts, ones that will take a few years to find out the results, he said.
What he mentioned was he noticed that because his students WEREN'T getting mired in syntax, they were focusing on the structure of concepts themselves, such as how a conditional or loop is built. He also said that he always thinks of any new language in reference to the first one he learned, in his case C++ I believe.
Anyways, they were interesting thoughts that got me thinking too! I know the main purpose of the block based languages is to make a "lower floor" for entry, but this is a cognitive/pedagogical notion. I will be curious to see what he and I think in a few years!
So on November 1st my AP students and I will be venturing to Kansas State University for their HSPC, which of course is High School Programming Contest. They have been putting this on since 1999, and my 12 AP kiddos are really looking forward to it, even though sometimes the practice on problems from the archives spooks some of them, especially the more novice kids. We are working up a problem solving workflow collectively so the ones who get more nervous have a guide to follow on steps. Oh, and they will be in four person teams, but only one computer per team. Still have to find out what the guidelines are on allowing resource materials and such.
Anyways, here is a recent practice problem. All three teams were able to pseudocode or flowchart the general algorithm OK, but only one was able to put it to code within the time limit. I work alone to try and solve the problems myself while they work, and I find the challenge of it quite fun.
2 Beginning — Probability Below are the probabilities for desired outcomes for each six different football games: Game number 0 1 2 3 4 5 Probability 0.5 0.4 0.6 0.75 0.3 0.83 Some combination of these outcomes must occur in order for a certain team to make the playoffs. Write a program that takes as input a nonnegative integer n giving the number of relevant games, then n different game numbers. It then outputs the probability that all n of these games have the desired outcome, assuming the above probabilities and that the games are independent. In order to compute this probability, you will need to multiply together all of the probabilities for the selected games (if no games are selected, the probability is 1). You may assume that 0 _ n _ 6 and that the n game numbers are all valid and distinct.
My team that solved it within the time limit created this. Aside from naming things a bit more descriptively, I thought they developed a pretty effective solution.
prob = [.5,.4,.6,.75,.3,.83]
gamenum = int(input("How many games?"))
probag = 1
if gamenum <= 0:
for i in range(gamenum):
probag *= prob[int(input("Game Number:"))]
So I've been tossing some sample problems at my AP students in preparation for the HS Programming Contest at Kansas State University later this fall. If I'm not busy with something else, I'm working on solving it myself for my own practice.
For the one from a couple days ago, I only had time to start the skeleton of the idea and didn't finish it to the full requirements of the problem. I showed them what I wrote this morning, as most of them were still battling the overall structure to approach the problem.
It was really nice, even as the teacher, to hear one of my students (and one of the best coders in the class) look at what I wrote and say, "That is beautiful code, man."
Here is what I wrote, feel free to shred me if you catch anything. Ultimately the problem included taking three entries, comparing them, and then giving output on which entry was the largest and whether it was a "t", "s", or "r".
def main(): print('Enter object types as t for triangle, r for rectangle, and s for sqaure.') print('Enter numbers only for dimension values.') print() firstObjectType = input('Enter type of first object: ') if firstObjectType == 't': h = int(input('Enter height of triangle: ')) b = int(input('Enter base of triangle: ')) object1 = triangleCalc(b, h) print(object1)
So we have a really active AFJROTC wing here at my school, which isn't surprising considering we McConnell AFB literally just three miles up the road and within our district boundaries. I wasn't aware of the Cyberpatriot competition last year in time to get us in and competing, but we did meet and study a bit to learn about cybersecurity. This year, we are going to get in the game!
It looks like I will have one AFJROTC team and one open division team. Thankfully we have a local college instructor in cybersecurity who not only lives in our district, but also has extensive background with the military as an active duty Air Force officer in cybersecurity and intelligence. We also have an Air National Guard intelligence wing up at the base, giving me even more potential mentors to call on. I was talking with one of the current officers in the intelligence wing at our home football game last Friday (it was military night), and he was thrilled that Derby HS has students in CS and offering opportunities in cybersecurity.
As we ponder what to offer to round out our CS course offerings, a cybersecurity is certainly one possibility. The issue I am finding is there isn't a lot out there of more "ready to go" curriculum, and this is one area I certainly don't feel comfortable crafting up my own curriculum, at least not yet.
Any thoughts on a cybersecurity curriculum, or should we be pondering other avenues? I know we could add AP CS A, but considering what types of jobs are actually available in our area, I'm not sure AP CS A and its focus on students aiming for four year CS degrees makes the most sense. I've been wondering about the notion of the "blue collar coder" as was brought up in a Wired article earlier this year, though I know some were kind of loathe to that notion.
Per the challenge from Mark Zamansky at C'est la Z, I am going to try and start posting more regularly on this blog I created many months ago.
Compared to most of you who blog, I am very much, as the title states, a noobie. While I have dabbled very lightly in HTML and GameMaker since the early 2000s, I really didn't get deep into CS until I and the middle school where I was teaching were selected to help Project Lead The Way pilot their new Intro to CS curriculum back in the spring semester of 2015. On that opening weekend in January 2015 when the pilot teachers met, and then a bit more during a week in June with the same group, I got dunked into the world of teaching CS. I now am teaching just CS classes at my district's high school, in my second year here at Derby HS.
Daunting? Yes. Overwhelming at times? Absolutely. Challenging? Wonderfully so! While I have a LONG way to go in building up my own skills, I absolutely am loving the challenge of keeping my own learning as sharp as possible. My focus right now is to build up my own Python skills, since my curriculum makes a pretty hefty use of Python.
I also more or less volunteered myself into becoming president of the re-established CSTA Kansas chapter. That is an area needing more attention from me, and right quick, as I really want to try and push forward many of the K-12 CS initiatives I see happening in other states.
Here at school, we are now near the end of our third week, and I certainly have lots of kids new to CS in my classes. My biggest challenge is getting them to break out of having everything laid out step by step where they just mimic, and start to actually understand what the bits of code are actually doing. For some, this comes naturally, for many others, it is a push for them to think at even just barely higher levels. They are too often far too conditioned to fact regurgitation learning. Have to remember, just keep swimming...
So this post comes about after reading this great blog post over at Computing Education Blog. The author, Mark Guzdial at Georgia Tech, poses some great questions about methodology in CS education, namely the ever present battle between the discovery/constructivist camp and the direct instruction camp.
Personally, I think they both have their place, as typically direct instruction is needed early on to help steer students through challenging material that is brand new, but as students get some foothold with their understanding, it is important to gradually shift them into models that are more discovery/constructivist oriented in order to hold their interest, and, for lack of a better phrase, "keep it real." The big challenge is the HOW and WHEN to make that shift, and of course it will not be the same for every student, which then brings up how to differentiate instruction without driving ourselves as teachers absolutely mad with behind the scenes work.
This pedagogical query also raises something in my mind that I need to explore in another blog post, that of what we would consider the "core" of what students need to know and understand in CS, and at the different levels. Yes, there is a new framework that has been released, found at k12cs.org, but I find many times that these types of works are so broad that it leaves me worth more questions than answers. I thought about this today as I read another blog post by Alfred Thompson at his Computer Science Teacher blog. He posed a question about the importance of number bases in pre-university CS classes. More to come on my next post!