*[Updated 6/7/2016, 8:08 PM: Added additional security and web app concepts based on feedback.]*
After a few years of effort, I’m thrilled to announce that my school district will be offering a new course in the fall of 2017: Software Engineering! As I will explain below, I’m also excited to ask for your ideas.
*Software Engineering is a weighted, two-semester course for students that have completed AP Computer Science. The course starts with a core set of software engineering topics (e.g., software engineering process; data structures; technology, society, and ethics) followed by a series of software topics selected by students that are aligned to students’ products (e.g., multithreading, networking, security, web apps, embedded systems, mobile apps). After gaining the necessary background knowledge, small groups of students develop a software product as they iterate through software engineering development cycles to produce a software product. Prerequisites: successful completion of AP Computer Science and teacher recommendation.*
We have started to work on the curriculum this summer. The plan is for each student in the class to be provided with their own Raspberry Pi. This sidesteps any issues with student not having the necessary permissions on the computers in the lab and enables students to work on their products outside of class. The software engineering process unit will introduce Agile methodologies in the context of a class project, which will also introduce the students to their Raspberry Pi as they develop an audio server. The data structures unit will be significant and fairly straightforward to design. Concepts will include linked lists, queues, stacks, sets, maps, binary trees, hashes, and hash map. The technology, society, and ethics unit will be similar to what we do in AP Computer Science but be concentrated to enable groups of students to focus on a specific topic in more depth. All students will complete these three units.
The remainder of the first semester will be different for each student group. Each group will decide on a product that they want to develop in the second semester. Based on their product, they will complete various modules (probably two) to gain the necessary background knowledge. Due to my background, I’m comfortable designing the networking and multithreading units. However, for the other units, I’m very interested in your ideas as I fear my expertise is either lacking (security, web apps) or outdated (embedded systems, mobile apps). Below, I’ll share some rough ideas for each unit.
Potential topics: cryptography (history, SSL, encryption), authentication (users, servers, certificate authorities), authorization, session management, firewalling stored user data, attack vectors (hijacking sessions, SQL injections, sanitizing user input)
Questions: Cybersecurity is super popular, but so many of the available resources seem targeted at a much more introductory and basic level than what would be challenging for a post-AP class. What topics would be appropriate for these students? What resources are available? What can their explore with their Raspberry Pi?
Questions: The last web app I developed was in Perl. What are the best technologies for students to be learning now? I’m excited to learn, and I want to make sure this unit is relevant. What resources are available?
Potential topics: bit-wise operations, I/O, interrupts, buffering, ADC, SPI
Questions: How close to the metal can you get on a Raspberry Pi? Which embedded concepts are most prevalent in today’s products? What resources are available?
Potential topics: iOS and Android apps
Questions: While Apple and Google seem to have pretty good resources, are there better resources available? Anything else I should consider for this unit?
I’m really looking forward to students working in groups for an extended period of time to develop an authentic product. In the context of an entire semester, groups will have time to complete multiple iterations. Ideally, I would love to partner each group with a stakeholder in the community that would benefit from a software product. I have some leads, and if you have any others, please let me know!
Please comment or strike up a conversation on Twitter if you have any ideas.
I think both php and meteor are good candidates for learning how to program for the web. For php, though, using a framework like Laravel would be important.
Thanks, Andy! I added Laravel to the list of technologies to investigate.
Chrome Apps may be worth learning, as they allow fairly platform-independent access to resources (like USB-connected devices). If we were starting PteroDAQ from scratch, we’d probably do it as a Chrome app rather than as a standalone Python program, to make installation easier.
Kevin, thanks for the recommendation to focus on Chrome Apps. All students have Chromebooks; so, this would be a good fit. (We don’t use the Chromebooks for anything currently in computer science….)