What are some events/contests besides GSOC and ICPC that a first year undergrad Computer Science Engineering student should get involved with? I am currently in my first year (in Bangalore, India) and I'm eager to get into competitive coding and programs like GSOC. I'm not aware of too many besides the two in my title, though.  I'd love to learn about a few more that people take part in so that I can plan ahead.

There are lots of international programming competitions for undergraduate students .Here are some of the well known competitions(not mentioned by you).As you didn't mention what kind of competitions you were looking for, here are some general competitions. I have provided links to past problems so you can decide which fits you best.
1.Google Code Jam
Code Jam is Google's longest running global coding competition, where programmers of all levels put their skills to the test. Competitors work their way through a series of online algorithmic puzzles to earn a spot at the World Finals, all for a chance to win the championship title and $15,000.
How it works?
Register and compete in Code Jam’s Online Qualification Round. It lasts 27 hours, but you won't need that long to earn the round’s qualifying point minimum. Once you do, you’ll advance to Online Round 1. They offer three sub-rounds for Round 1, and you can compete in as many as it takes for you to finish in the top 1,500 of any of these rounds.
The top 1,500 from each sub-round move on to compete for a spot in the top 1,000 contestants of Code Jam Online Round 2. These top 1,000 contestants advance to Online Round 3 and earn a limited edition Code Jam t-shirt.
The top 25 contestants from Code Jam Online Round 3 will compete in the Virtual World Finals for the championship title and a cash prize of $15,000.
Past Problems
2.Google Hash Code
Hash Code is a team programming competition, organized by Google, for students and professionals around the world. You pick your team and programming language and we pick an engineering problem for you to solve. This year’s contest kicks off with an Online Qualification, where your team can compete virtually from wherever you’d like, alongside your virtual Hub. Top teams will then be invited to compete from our virtual World Finals.
How it works?
Once you’ve registered for the contest, you’ll gain access to their Judge System. The Judge System is their online platform where you’ll form your team, join a Hub, practice, and compete during the rounds. During the Online Qualification, you’ll watch their YouTube livestream to be introduced to the problem, and your team will have four hours to solve an optimization problem using the programming language and tools of your choice. Teams can also compete alongside other teams in your area by joining a virtual Hub . The top teams from the Online Qualification will be invited to the virtual World Finals, where they’ll work together to solve another challenge and compete for cash prizes.
Past Problems
3.Google Kickstart
Kick Start is a global online coding competition, consisting of three-hour rounds of a variety of algorithmic challenges designed by Google engineers. Participants can compete in one or all online rounds held throughout the year, and will have the opportunity to develop and grow their programming abilities while getting a glimpse into the technical skills needed for a career at Google (top participants may be invited to interview at Google).
How it works
Register for Kick Start once on the website and you’ll be set up to compete in any round you’d like! When each round is open, the three-hour countdown begins and you’ll compete on our website solving algorithmic and mathematical problems. Following the round, you can check out your rankings and the round analysis. If you were a top competitor, you may be contacted by Google for a chance to interview.
Last year's problems
4.Microsoft Imagine Cup
Reimagine technology solutions in a competition designed to help you make a difference in an online world. With four new competition categories—Earth, Education, Health, and Lifestyle—there’s even more opportunity to share your tech ideas for some of today’s most pressing global challenges. What could you create next?
Transform your ideas into action with a purpose-driven application using Microsoft Azure technology. You could win mentorship from Microsoft experts, the chance to showcase your work on a global stage, and other great prizes.
Get Inspired
5.facebook Hacker Cup
Hacker Cup is Facebook's annual open programming competition. Open to participants around the world, we invite you to apply problem-solving and algorithmic coding skills to advance through each year’s online rounds, win prizes, and have a chance to make it to the global finals and win the grand prize.

Last year qualification round
Here are some other "competitions" and resources for practice:
1.Codeforces
Codeforces is a project joining people interested in and taking part in programming contests. On one hand, Codeforces is a social network dedicated to programming and programming contests. On the other hand, it is a platform where contests are held regularly, the participant's skills are reflected by their rating and the former contests can be used to prepare. Codeforces constantly develops and we plan to improve the platform to give the participants the opportunity to organize their own contests, filling the project with learning content, developing Codeforces as a training and learning platform.
It also provides contests and practice for ICPC.
Codeforces conducts different competitions for different rated coders regularly and you can participate in it depending on your Codeforces rating.
Competition structure
It may also conduct competitions with other companies and sponsors at times.
2.atcoder.jp
AtCoder is a programming contest website based in Japan.
There are three types of official contests in AtCoder:

AtCoder Grand Contest (AGC). This is our best contest. The problems will have high originality and require interesting observations.
AtCoder Regular Contest (ARC). The problems may be a bit typical compared to AGC problems, but still we think most of you can enjoy them and they are good for practice.
AtCoder Beginner Contest (ABC). This is mainly targeted for those who are new to competitive programming. The problems will be easy and educational.

3.SPOJ
SPOJ (Sphere Online Judge) is an online judge system with over 315,000 registered users and over 20,000 problems. Tasks are prepared by its community of problem setters or are taken from previous programming contests. SPOJ allows advanced users to organize contests under their own rules and also includes a forum where programmers can discuss how to solve a particular problem.
4.Project Euler
Project Euler is a series of challenging mathematical/computer programming problems that will require more than just mathematical insights to solve. Although mathematics will help you arrive at elegant and efficient methods, the use of a computer and programming skills will be required to solve most problems.
The motivation for starting Project Euler, and its continuation, is to provide a platform for the inquiring mind to delve into unfamiliar areas and learn new concepts in a fun and recreational context.
The intended audience include students for whom the basic curriculum is not feeding their hunger to learn, adults whose background was not primarily mathematics but had an interest in things mathematical, and professionals who want to keep their problem solving and mathematics on the cutting edge.

P.S: There are a lot of other programming competitions but it all depends on your interests(including hackathons, A.I competitions, obscure code competitions etc.)
Upvote/accept if you find this useful


Why did interest in CS majors plummet in the United States after the mid-80s? As shown by the following graph, the percentage of U.S. college students earning bachelor's degrees in CS peaked in 1986, with the percent of freshmen planning to major in CS peaking for the classes of 1986 and 1987.

Why was there a precipitous fall after these years? As always, claims should be backed by data.

This question is relevant to CS departments planning to understand and plan for changes in enrollment. This question is related to, but different from, this question about gender distribution of CS majors.

The Atari VCS game E.T. came out in December 1982, which led to the start of North American video game crash of 1983, the end of a video game software industry boom.  That market fell from 3.2B to perhaps 100M (in U.S. dollars) in just a couple years. Programmers were being laid off in droves.  Boxed software was being sent to landfill. Software and computer startups were starved for capital, or went under.  Game software developers lost much of their temporary "rock star" status.  That business event may have discouraged lots of kids from picking or sticking with a major where employment would have to come from a visibly crashed job market.

The dot-com stock market crash of 2000 (which also led to a vast number of computer industry related job lay-offs) probably had a similar effect on CS graduations after 2003.

Just after the '83 video game crash, easier-to-use personal computers (Mac, Amiga, Wintel, et.al.) were being introduced, which may have allowed end-user (business, science, etc.) productivity to increase faster than the number of software jobs previously required to support that productivity, thus making alternate (non CS) careers possibly more valuable, or more interesting to students, than CS related ones.

Added: The steep rise starting near 1980 is coincident with the PR leading into and through the IPO of Apple Computer (et.al.).  Computer magazines were becoming thick with ads.  Lots of kids wanted to either become a personal computer start-up company stock option millionaire, or at least work for one.

Added: The Netscape IPO (and PR about the millionaire programmers it created) in late '95 looks like it was a just a few years before a similar steep rise in CS graduation rates.


How to explain ETH to undergraduate students? I am a TA for complexity theory course. I want to explain the Exponential Time Hypothesis (ETH) to undergraduate students. They have done algorithm and theory of computation course. They know about SAT problem, with brute force algorithms to solve SAT. I have explained the ETH hypothesis in less than half hour.

One way is like this wikipedia

  "The hypothesis states that $3$-SAT (or any of several related NP-complete problems) cannot be solved in subexponential time in the worst case". The exponential time hypothesis, if true, would imply that P ≠ NP, but it is a stronger statement. It can be used to show that many computational problems are equivalent in complexity,in the sense that if one of them has a subexponential time algorithm then they all do.

I then try to explain the each important point of the of definition. I don't this will be the right way. I want to convey the significance of the ETH.

Question : How to explain ETH to undergraduate students?

It seems that you are aiming to convey the significance of disproving ETH? If you're looking to leave some impression, it's always better to show rather than tell.

I think your students need to see some examples of practical areas and difficult problems that efficiently reduce to SAT. If you can demonstrate to them that SAT is a "funnel" of sorts for many other kinds of problems, your students can piece together for themselves why solving SAT in sub-exponential time would be game-changing.

Some example problems could include task scheduling, the traveling salesman problem (and by extension, pretty much any sort of path-finding problem), register-allocation in code compilation, general propositional logic inference, etc. You can also discuss industries that use SAT-solving already, like circuit design and e-commerce.

This would take a fair bit of work, but you could even demo using a SAT-Solver; Sudoku is a popular and relatively easy example problem, and it never fails to amaze me how quickly it solves even the hardest of puzzles. If you need one, CryptoMiniSat is a great off-the-shelf SAT-Solver https://github.com/msoos/cryptominisat/releases.


Beginner Javascript course - recommended books I was asked to teach Javascript to total beginners. Since it would most likely be free of charge, I would rather not spend time making my own slides and material. I would follow a book or some other existing material, draw things on whiteboard for further clarification, do simple quizzes, and focus on helping students actually code stuff.

Ideally this book or material would:

Cover Javascript but also HTML and CSS basics
Have some quizzes
Be interesting for beginners
Be more modern JS oriented
Also touch upon NodeJS with some command line and server development

A great resource to learn JavaScript is Eloquent JavaScript by Marijn Haverbeke: https://eloquentjavascript.net/.

You can download the pdf for free, or you can read it online, and this is probably a better choice since you can take advantage of the code sandbox.

It is definitely suitable for beginners but a wide range of topics is covered, included Node.js (chapter 20). However, with regards to your requests, HTML and CSS are introduced but you will probably need supplementary material about them.


Seeking advice on mentoring without participating in exam cheating in the new chaotic environment of the pandemic I mentor online (in assembly language and computer architecture) at codementor.io.  The way I work is to have a zoom meeting with a student to instruct them on what they are confused or stuck on.

More and more, due to changes in the way course work is being carried on during the epidemic, I'm having new students as me for help with take home exams.  Of course, I won't do that if I know it is happening.

Many of these such requests directly and blatantly ask for help with an exam; however some students appear to have lied that they are doing practice exams or have homework assignment they need some help with when it really was a take home exam.

Here's what I do when I encounter a new student asking for help.

For some, I look for urgency for a very specific time they want me be available
With some I feel I need to ask them directly if this is an exam or practice
I generally ask what the time frame is

I get concerned if the time frame is either immediate or very specific time (say tomorrow) and/or there are multiple question that are somewhat randomly related and it is not obviously a practice exam.

But with the latest changes, moving to home and online study, more and more I'm seeing exams being given as take home and with a two or so day time period, so my approaches to detecting situations that I don't want to be in are not working as well as I'd like, and, I'm being approached more often.

It's a tough situation and I do sympathize with students because at least right now with sudden changes there is some chaos; many are not getting the instruction they need and help from faculty, and for the moment, increasingly so because of the pandemic.

Further, instructors — who are suddenly shifting from in-class exams to take home exams — are probably not versed in best practices against cheating.

My question is, does anyone have any advice on the subject, e.g. on how to help honest students (e.g. practice exams, theory, etc..) while avoiding cheating on exams?

If I were to try some online sleuthing, the first question I would ask is for the course's website, if there is one, or for links to recent assignments. This has the double benefit that your primary goal in doing this is to make sure that your instruction is as helpful as it can be.

If students cannot provide this, then my next question would be about how you can go about contacting the teacher, for the same reason.  Your instruction can simply be better targeted at this point if you have some sense of what the course is doing.

My guess is that at this point, most cheaters who wish to hide what they are doing will give up on working with you.

(As an aside, you may find that some teachers have, as a practical matter, made their exams entirely open-internet and open-help, and hold a standard that if the student understands what they have written, then they will accept the work. In this case, your assistance might not be considered cheating at all.)


Should an educator define terms rigorously? I took a programming course from an open university in Finland. One task was something like the following:

Find largest connected sequence of numbers from given set. For example, if input is

1,2,3,5, the output should be 1,2,3. If the input is 2,4,5,7,9, the output is 4,5. etc.

Are there opinion what should a student do when he or she sees such a problem?

I mean there are problems. For example, a mathematician might say that connectedness is a term from topology and some spaces are connected, not sequences. A punctual student might say that one has to define terms rigorously. No matter how many examples you give, there might be a new sequence that might or might not be connected. Therefore, one should always define terms rigorously instead of give just examples.

So what should a student do when he sees a problem where something is not given rigorously? And is it possible to study computer science such a way mathematics students do as they define everything rigorously and they do sound reasoning for everything? I hope to see some analogy as mathematics can be studied by studying ZFC and reduce many things to the set theory.

You have two complementary questions here. What should the student do, and what should the professor do. I'll handle them separately.

Whenever you can't understand what is being asked of you, ask for a better or more complete explanation. You can't fairly answer a question that you don't understand. Of course, you should be aware of standard terminology and should be able to depend on that being a shared knowledge. But even if that is not the case, you should ask, or consult other sources, so that you don't have gaps in your education.

The question of what the professor should do, however, is a bit more flexible. Mathematicians and other technical people are rigorous about some things because they are more important and generally useful than other things. For example, we are rigorous about the definition of the derivative in calculus and about what it means to sort numerically. But some things don't need the same care. If a professor needs to put a name to something for a single conversation and it isn't a generally useful or well known concept then there may be no need for complete rigor. A shared, but informal, understanding may be enough for the current purpose.

So, for example, if the professor wants to define something rigorously, I suspect that s/he will want to remember that definition for the long term. If it comes up in an exercise but you will be expected to have learned it well for a later exam, then some rigour is called for. But for the actual example you give, connected sequence is probably enough, with a few examples to get you on the right track.

However, If you are in doubt about the importance of a term, then ask about that also. "Do we need a rigorous definition here? Will we return to this concept?"

Sometimes a teaching analogy or metaphor is enough. If everything were made strictly rigorous your education would become much more difficult (more to remember) and for most learners, much more boring. People are good about learning from metaphor. But professors need to be careful not to load too much onto any given metaphor.

I'll note that rigor in mathematics is mostly a feature of the previous century. People formalized what was, up to then, considered well known without formalisms. Even today, people discovering new mathematics may struggle for a while about what are the correct formalisms for a new concept. It may take a while for it to "shake out". The important things then get properly defined and names that evoke the correct mind set are applied - or we hope so, in any case.


Teacher Community - Using CS50 for AP I will be teaching AP Computer Science Principals this fall for the first time. I've decided to use the CS50 curriculum. (partially due to Curriculum choice for AP Computer Science Principles)

Is there (or are there multiple) teacher communities around providing support for using CS50 to teach AP CSP?

The APCS community maintains an active web site and mailing list. It has many users who ask and answer many questions.

Start here to learn more: https://apcommunity.collegeboard.org. Find your community from there. Note that the site has separate lists for APCSA and APCSP. You can join several of the communities.

You need to join (free) and then just ask for the experience of others with CS50.


Encourging Growth mindset, in computing lesson I sometimes have pupils, that struggle to learn because they have a fixed-mindset (“I can't program”, “I can't use computers”, …).

I the context of teaching a Computing (Computer Science, IT, Digital Literacy, Computational Thinking  ) lesson, what can be done to encourage growth-mindset?

Footnotes:

Growth-mindset / fixed-mindset, are from research by Carol Dweck. Dweck's work shows that a students belief about whether they can do it has a massive effect on outcome. I think some one else said “Whether you believe that you can do it, or that you can not, you are correct.”, this sums it up.

I like both of the existing answers, but I wanted to add another technique that I think is very important: you should show that making mistakes or not knowing is part of the process.

Don't: Make your lessons all about perfect example code and only best practices.

I'm a student in your class. I've understood most of what you told me in lecture. Now I'm at home, sitting down at my computer looking at a homework assignment. I have no idea what to do! Then I start writing code, and I get a ton of errors. Ugh, maybe this computer stuff isn't for me!

Do: Include mistakes, debugging, and looking stuff up in your lessons. Do live coding exercises.

I'm a student in your class. Now I'm at home, sitting down at my computer looking at a homework assignment. I have no idea what to do, but I remember from class you told me I should break problems down into smaller steps and then take those steps on one at a time. Now I'm writing code, and I get an error. Good thing you showed me that errors are a normal part of programming, along with how to debug the issue. I even know how to look stuff up in the reference if I'm confused!


Teaching past the "symbology" of a language I've been recently helping someone with their beginners Python programming course at their university (though I don't think the specific language is particularly important).

At times I'm frustrated, because I seem to be unable to push them to bridge, what seems to me to be, incredibly small leaps in logic.

At one point there was a question that stated "using the solution to Q1, solve Q2, but do it for a range of numbers".  They were able to do Q1 on their own, they were able to independently understand ranges in python, and how to iterate over them, and create lists with ranges. What they couldn't seem to understand, is that basically copying and pasting the code from Q1 into the for loop would do exactly what they asked.

I tried to present analogous scenarios to give hints, heck tie it to real life ("you know how to make an omelette, what do you need to do to make 10?").  They seemed to "get" these other things, but when it came to looking at code and trying to apply the same logic, they just straight up had no idea what to do.

After a long time they were not able to grasp the problem, and I didn't feel comfortable literally just telling them the answer.  They eventually talked to another person who gave them a solution (not what they used) and that helped them finish their own independent solution that was 99% of the way there. After the class after the homework was due, they noted how they essentially "face palmed" after the professor explained the expected solution (basically copy paste Q1, as I described).

I think part of the issue is that they have yet to cover functions, which would make it a whole lot easier: abstract away the Q1 part of the question, and thus make it easier for them to make that leap.  On the other hand I fear that I'm too far removed from the point where I had started learning to relate to their learning experiences (I remember when I didn't even understand for loops, so at least I know I had some of the same issues when I was younger).

Is there anything I can do in these types of scenarios?

Knowing how to use a tool is different from knowing why/when to use a tool

At a basic level, there is a difference between having certain skills and learning to apply/orchestrate these skills to achieve something more complex.

Forrest Gump was a good runner, but had no knack for understanding American football and needed to be told to run when it was time for him to run. Forrest has a skill (running), but was notoriously incapable of seeing the bigger picture (how to win a football match). This is made painfully clear when Forrest does not stop running when he reaches the endzone, instead running into the stadium.

In order for students to orchestrate the separate skills they have (iteration, calculation, ...) they must first be comfortable with the skills themselves and know them like the back of their hand.

Right now, your students are Forrest Gump. You taught them to run. You have not yet taught them how to decide for themselves why/when/where they should run and why/when/where they shouldn't.

Breaking down the problem is a skill on its own

Additionally, understanding that a complex challenge can be solved using an orchestration of basic skills requires your students to learn how to break down the problem.

  They seemed to "get" these other things, but when it came to looking at code and trying to apply the same logic, they just straight up had no idea what to do.

Based on your description, I infer that you're expecting this to automatically happen, but that's not the case.

  After a long time they were not able to grasp the problem, and I didn't feel comfortable literally just telling them the answer.

As a teacher, if your students do not know the answer, it's counterproductive to withhold the answer from them. It's akin to the old "if you don't know what's wrong then I'm not going to tell you" joke. Clearly, the fact that they are not finding the solution means that they are currently unable to find the solution. Withholding the answer perpetuates the issue and is going to lead to dispirited students who no longer care to look for the answer when they don't know the answer yet.

Teach them to break down the problem without touching any code. Walk them through the problem description, and analyse the issue to see if you can break it down into smaller steps.

In theory, you should never tell them how to solve it. All you should do it break down the problem in smaller and smaller steps until your students realize that they already know how to solve these (sufficiently small) steps. Depending in your students' skill level, you may have to break things down repeatedly.

If they really aren't getting it, then it's time to consider if the students have have enough exposure to the rudimentary skills that you're asking them to orchestrate.

If you break down a complex problem down to e.g. number addition and students still don't respond to it ("I know how to solve that part"), then you're either dealing with disinterested students or students who aren't comfortable with the basics yet.

Functions are essential constructs toward abstraction

  I think part of the issue is that they have yet to cover functions, which would make it a whole lot easier: abstract away the Q1 part of the question, and thus make it easier for them to make that leap.

Yes, this is probably the biggest factor in why they're not thinking in abstracted terms. However, it's not so much that they should already know functions.

When you introduce functions with simple examples that do not yet warrant functions, then students are left wondering what the purpose of a function is other than "to put things elsewhere". Coincidentally, my wife is taking a beginner's development course and this is exactly the stage they are at.

Rather, this is the exact moment for you to introduce functions. Let them solve Q1 on their own, and then refactor Q1 to use a function. Tell them that it's the same solution but in a different form and do not elaborate on the purpose of functions yet; only explain how it works.

Then, when you let them tackle Q2, let them do it by themselves, without any suggested for loop. Wait for them to make the mistake of copy/paste repeating themselves. More importantly, let them make that mistake.

When they've made that mistake, present a (fictional) Q3 in which you ask for them to perform this calculation for one million numbers, and then look as they all sigh and moan about the challenge.
Alternatively, you could phrase Q3 as a change to the calculation logic, which will require them to change all instances of their copy/pasted code. Bot options lead to the same result: unhappy students.

Now, you've created the perfect audience that is incentivized to learn about method abstraction and how to prevent copy/pasting in code. Refer them back to your Q1-with-a-function solution. Work out Q2 using that pre-existing function. Work out Q3 with that same function.

This will convey the importance of abstraction (functions) as opposed to brute force (copy pasting). Work smarter, not harder.

A practical example

  Pythagorean theorem - calculate the hypotenuse of a right angle triangle when given the length of the other sides.

We all know the theorem, where c is the hypotenuse:

c² = a² + b²

or when we solve for c:

c = √(a² + b²)

But how do you write an application that finds the value of c?

As a developer, you immediately start breaking it down into core tasks: addition, squaring (or multiplication), square rooting.

But your students aren't going to think this way. So far, they've been introduced to problems for which there was an explicitly existing tool. Their first few challenges were all one-trick-ponies, i.e. they could be solved by knowing a particular keyword and implementing it.

Logically, they are going to expect that this challenge (just like the ones before) will have a simple one-keyword-answer, which it doesn't. Walk them through it. Tell them there is no short answer to this, they must cobble something together with what they know.

Present the challenge to your students, and ask how they are going to solve this. If no one starts breaking down the problem, ask them to do the math manually:

  What is the length of the hypotenuse when the length of the other sides is 3 and 4?

When they tell you the right answer (5), ask them to show their working out. What you will get is a written-word-pseudo-code answer to the programming challenge. Something along the lines of:

  I squared the 3 and the 4, I added them together, and then I calculated the square root.

As they explain this, write it down:

Square the numbers
Add them together
Take the square root

And now ask them if they know how to solve any of these bullet points individually.

Now, you will get students who see that the complex challenge (Pythagorean theorem) is nothing more than a combination of simpler challenges (multiplication/squaring, addition, square rooting) which they already know the answer to.

To really sell it, you could enforce that the challenge must explicitly break down the problem into these three steps:

Enforce that students make four separate methods:

calculateSquare(x)
add(x,y)
calculateSquareRoot(x)
calculateHypotenuse(a,b) where you've explicitly disallowed any direct calculation and are only allowing them to declare/assign variables and call the other three methods.

If the students still seem to struggle doing this on their own, split the students into groups of three, where each student tackles one of the three "simple" methods.

When they are finished creating their own methods, they can then work together at implementing the main calculateHypotenuse(a,b) method which will rely on the methods they just created.


How do I teach "math equality" vs. "CS assignment" vs. "CS equality logic operator"? Consider the following three uses of equality:

In mathematics, the statement $x = x^2$
In Python, the statement x = x**2
In Python, the expression, x == x**2

The math statement is a constraining assertion restricting x to the set $\{0, 1\}$; the Python assignment always evalutes the right side and assigns to the left side; the Python expression always returns True or False.

When and how should the differences be pointed out to students? Are there examples producing unexpected results that are especially effective in causing students to abandon the idea that these three meanings of equality are equivalent?

I actually cover this idea in my very first lesson in AP Computer Science, because I have found that students find the different uses of = to be confusing, indeed.  I run a unit based on Tom Roger's unit, Java Ain't Algebra, and I also talk about it a little here.

I do this right at the beginning because, if mutability is not made explicit, students do not seem to exhibit a total loss of comprehension or ability right away, but rather, very slowly slip further and further behind.  They will never be able to articulate what they find confusing about the material, because every piece seems to make sense when looked at in isolation.

The confusion itself stems from simply not realizing that there are articulably different uses of equality in the first place.  In my experience, simply pointing it out is actually enough to stem the tide of the confusion.  (You gave a perfectly wonderful explanation in the question itself.)  Then, two or three more times over the first few weeks of class, I will gently remind them that this equals (some code statement we are examining) is a mutating equals, not the constraining equals of mathematics.

I have not had problems from students in this regard since I began this practice.


How to help students avoid being distracted by bells and whistles I teach Windows Forms programming, and now ASP.Net (essentially the same thing, except you view it in a browser) and I am dismayed that students seem to spend an enormous amount of time straining at gnats, trying to get picky details of the appearance correct. This involves them attempting to do extra things, like adding backgrounds, and putting images in to buttons and carefully positioning and sizing everything. This eats up masses of time and energy and they constantly ask me for help with details that I know nothing about, like obscure subtleties of CSS and so on.

Is there some way to get students to focus on the point of a lesson, which is to understand programming concepts, and not just stare in fascination at the colors and shapes on the screen?

(I learned programming in a command-line environment, without Windows or web browsers, so I am at a loss as to why all of this is so interesting to the students. My attempts to add even small enhancements to appearance for my demonstrations are such a time-sink that I tend to drop them in favor of getting something to work. For example, try to change the color of a Jumbotron.)

This is a very common problem. Students tend to focus on the stuff they can see, which can be to your benefit (visual programs are more engaging than command line applications), but like you've discovered, it can also be very distracting.

I think a lot of the problem can be prevented by adding a disclaimer at the top of assignments. Something like this:

  Please note that I am not grading you based on what your program looks like. It can be tempting to obsess over the look and feel, but try to resist that urge! Graphic design is an important field, but this course focuses on [insert focus here]. If you want to explore topics like graphics and design, please do so only after you've finished the main assignment. You also might want to check out [insert graphics course here] after you finish this course.

You might also include guidelines on what's "in scope" for an assignment and what's outside the scope. Something like this:

  Although this assignment includes visual elements, please note that I'm only grading you on your core logic, not what it looks like.

  The following are in scope for this assignment:

  Changes to server-side files.
  Showing the correct components on the client side.
  Getting input from the client to the server.

  The following are not in scope:

  The look and feel of the client side.
  CSS changes.
  Layout or style changes.

  If you're interested in exploring the out-of-scope topics, make sure you do so after completing the in-scope topics.

Or maybe something as simple as this:

  Make sure the basic functionality works before working on the look and feel of your program! Remember: it's better to have an ugly program that works correctly than it is to have a beautiful program that doesn't work.

You might also explain the concept of minimum viable products. It might also be useful to mention feature creep and bike shedding.

A lot of this just comes down to communicating your expectations.


Why might be the benefits of teaching data structure course in Python? As the question suggests, is it a good idea to teach Data Structure course in Python. Or what be any good rationale for teaching Data Structure course in Python and not in C++.

Since we're missing a lot of information, this answer will be fairly bare-bones.
There are no "right" or "wrong" answers here.  Everything hinges on the goal of the course.  And this is as it should be.  Usually, you choose the learning goals for the course, and then choose a language that helps you to achieve them.
If the goal is to understand algorithms and data structures, you would want to work in the language that students would most easily grasp the underlying concepts.  Typically, that would point you towards high-level languages that handle garbage collection for you, but it might be a lower-level language if earlier coursework within the program gives students a lot of fluency in a that language.  (Garbage collection itself could be studied within an algorithms class, as it's essentially a graphs problem.)
If the goal is to get a lot of practice with direct memory management, then you would certainly want to move towards a lower-level language such as C++.  This would come at the expense of some algorithms/data-structures study, but the tradeoff could be considered worthwhile.
It all depends on the outcome the instructor is going for.


How can I maintain interest in front end? When I teach front end web development, it always happens that I start the year with a bunch of students who are ready to redesign Facebook on day 1. With expectations like that, it's always a letdown when I start talking about what a tag is, what a markup language is, CSS priorities, code quality, and generally the details of how good design is implemented.

How can I stop students from dropping off and losing interest? This is especially pertinent to me because my class is extracurricular and is something interested kids can take if they want to, but if they get bored they can just stop coming. The kids are in high school.

Specifically, I'd think that my activities could be changed to be more exciting and let the students do more from the get go, I'm just not sure how I could do that.

As Choirbean noted, this is fundamentally a question of motivation. I don't think it's about making something more "exciting." That is, the secret is not in something extrinsic, which is what makes this such a challenging issue whether it be front-end development or really any topic.

I draw on Daniel Pink's TED Talk whenever I think about getting students to do something. The gist is that there are "three elements of true motivation -- autonomy, mastery, and purpose." The key to start is autonomy; students need that freedom of choice to get personally invested and be motivated by more than a grade.

I can speak to autonomy with front-end development based on a project I did this year. I assign two HTML/CSS assignments. For each, they can make anything they want the subject of their pages: a travel destination, a TV show, a sports team, anything. That was the key. They were so excited about describing something they loved that they were invested enough in the topic to work on the HTML/CSS.

The requirements of the first assignment were the following:

DOCTYPE
html tags
head tags
body tags
title element
header element
paragraph element
proper filename
bonus: comment with HTML definition

As you can see, it was elementary. That way they had mastery of HTML basics (i.e. the DOM) and could then grow to build something more sophisticated and aesthetically pleasing. With the second, they had to include the following:

table
link to external website
button
two divs (with div IDs)
list
heading
paragraph
three images
text not left-aligned
two fonts
three colors
additional HTML feature
additional CSS feature

Nowhere did I grade the subject matter of their sites. Rather, I focused on the skills they needed to demonstrate competency in and let them prove to me -- in whatever form they liked -- that they were indeed competent in them. That freedom, to me, made the difference in motivating students to want to complete this work.


What is the pedagogical value of Conway's Game of Life? Lately I've come across Conway's Game of Life in a number of different arenas (articles, conferences, blogs, etc.). Last night I coded it up in C and was utterly mesmerized watching it. That being said, I'm trying to come up with one or two precise, concrete, engaging concepts I can use it for in the classroom.

It comes up in my course (CS50 AP) as part of a lesson on simulations. The objectives from the AP Computer Science Principles curriculum are as follows:

LO 2.3.1: Use models and simulations to represent phenomena.
LO 2.3.2: Use models and simulations to formulate, refine, and test hypotheses.

It is clear to me that the Game of Life works for reaching both of those objectives, but I get a sense that I'm missing something more that I could use it for. Keep in mind that these students are relatively new to computer science and programming as high school students.

Ultimately, what is the pedagogical value of Conway's Game of Life for a high school CS course?

I really like Ben's answer, but I wanted to add my two cents:
Like Ben and others have mentioned, Conway's Game of Life provides a "wow" factor that's useful in and of itself. It's simple to understand, and easily leads to pretty patterns and cool animations. This inspires students to want to play around with the code, which by itself is pretty valuable.
On top of that, it leads to some pretty interesting more advanced topics, such as:
Emergence
From Wikipedia:

In philosophy, systems theory, science, and art,  emergence is a phenomenon whereby larger entities arise through interactions among smaller or simpler entities such that the larger entities exhibit properties the smaller/simpler entities do not exhibit.
Emergence plays a central role in theories of integrative levels and of complex systems. For instance, the phenomenon of life as studied in biology is an emergent property of chemistry, and psychological phenomena emerge from the neurobiological phenomena of living things.

Imho, emergence is one of the coolest things about computer science.
Swarm Behavior
From emergence, you also get to talk about swarm behavior, including programs like:

Boids
Ant colony optimization algorithms.
Swarm intelligence
Particle swarm optimization
Artificial bee colony algorithm

The list goes on, and the related articles at the bottom of all of the above are a vertiable black hole of fascinating stuff.
Artificial Life
From Wikipedia:

Artificial life (often abbreviated ALife or A-Life) is a field of study wherein researchers examine systems related to natural life, its processes, and its evolution, through the use of simulations with computer models, robotics, and biochemistry.

From here you can talk about artificial intelligence, neural networks, machine learning, etc.
Cellular Automaton
The Game of Life is just one example of a cellular automaton. There are a ton of other examples.
You could use a 1D cellular automaton to introduce the concept to less experienced students.
Simulations
The game of life (and other cellular automata) also has practical applications, such as being used in simulations of bacteria, epidemic / disease outbreak, and forest fires.
Do a search for "cellular automata forest fires" or "cellular automata disease modelling" for a ton of results.


Study the book "Computer Architecture- A quantitative approach" (3rd Edition) for the first time Whenever I searched for "best book for computer architecture" in google, the first result to come up was this book "Computer Architecture : A quantitative approach"(3rd Edition) by Henessy and Patterson.

The said book seems to be quite popular and is followed as the text book in many colleges throughout the world. Even the amazon reviews of the said book is quite good. Now many people said me that the 3rd edition is better than the 4th edition and though the 5th edition of the said book is out now, I could get hold of a cheap used copy of the 3rd edition.

There is an introductory text pertaining to "Computer Organization" by the said authors, which is quite easy (and not bulky) and one can easily go through it without much effort as this very organization book starts from the very basics.

Now coming to my question. How should I read this book, Computer Architecture: A Quantitative Approach for the first time ? There are quite a few things I want to add, the book is quite bulky and the language and terminology (till the end of first chapter) is not quite easy as in the very first chapter of the book the author talks about things such as trace driven simulation,embedded benchmarks and so on, and I feel that the author assumes one is quite familiar with concepts,as is evident from the way the text is written in the first chapter. I have not yet started reading the second chapter. There are few more things, in each chapter the author talks about real life examples of the processors or the other hardware and gives a case study of the same. Though it is good for better understanding, but might be of more importance in the subsequent reads, after one has gone through the basics or the core sections in each and every chapter.

Now I want to know how can I read this very book for the first time, to build my concepts,(I want to sort of learn only the necessary and sufficient concepts of each and every chapter, in depth though in the first reading) and after having a more or less rough but deep idea of the content of the entire book, I want to read the book again in totality, reading the portions which I might have skipped in the first read. The above book is quite bulky (I am not afraid of that, had it been so, I would not even bought it) and chances are there that I might get lost till I read the book entirely.

So can a schedule be suggested to me, which I shall follow to read the book, I want a schedule or a routine, which I shall follow in a hardcore manner while my first read, with selected but important necessary and sufficient topics from each chapter and a well ordering of the same.( Sort of programming the playback of old video compact discs on VCD players,such that out of the many tracks only those are played and in the order in which I program my player).

I did not face such a problem while reading a textbook before, I have read many texts like Ullman's Automata, Tenenbaum's Data Structure, even Morris Mano's Computer System Architecture... I have even gone through the lecture series by Prof.  Rajeev Balasubramonian to build the foundations which uses the 5th edition of the said text

Now I want to focus on reading the text. Any help shall be highly appreciable.
If any part of my post is not correct or my tags are incorrect, do rectify me.

I think you first need to decide what your goals are. Are you interested in computer architecture because:

You want to design computer hardware and so need to understand it at a fundamental level?
Or because you want to write software whose performance is enhanced by an above-average understanding of computer architecture?
Or because you are just mildly curious about how computer architecture works?

In the preface to the 3rd addition, the authors talk about why they selected the material they did, and they give this warning:

  To allow for this new material, we reduced the extent of introductory material, assuming the knowledge of the concepts in our introductory text, Computer Organization and Design: The Hardware/Software Interface.

So my advice is to start with that introductory text. If all you're interested in is a passing understanding of how the architecture works so you can write better software, or because you're just curious, then you can probably stop at that point.

The introductory text (at least the 4th edition of it) also includes a chart at the beginning listing which sections of the book should be read for a hardware focus or software focus, which should be read carefully, which can be glossed over, and which are just interesting but not necessary.

If you really want to understand modern computer architecture at a fundamental level, then after finishing the introductory text, you should probably get a later edition of the advanced text.

The fourth edition added coverage of multicore chips, which is a pretty fundamental aspect of modern computer hardware. The fifth edition has some pretty significant changes and adds an emphasis on mobile device architecture.

As for what order to cover the chapters, each edition is a bit different, but the the preface of each one contains suggested reading paths depending on what your goals are. The later editions go into more detail on this (by section rather than by chapter).


What would be a good project for teaching big program concepts? I'm a freelance computer science tutor with junior high and high school students (working outside of school - I give them assignments.
Mostly my assignments are problems we find online, such as Codewars or USACO problems. This isn't the best way to teach them about large project issues, such as "maximize cohesion, minimize coupling" or clear structure and documentation.
When I had fewer students I did unique projects with each one, but that takes way too much time outside the session for me to prepare. So what I'm looking for now is some kind of project I can do with my students that would teach large project concepts.
This project may be fairly complex. But -- it should be the kind of complexity that my students can wrestle with on their own. I need to be able advise them on it in a one hour lesson. The problem with most student projects is that they spend the week making a mess of things and I can't sort them out in an hour.
It should be doable in Python or C++. I don't know much about web programming so that's probably out.
It should be fun and hold their attention - which probably means graphical game. I can't think of a text-based project which would hold their attention enough. If we use Qt then at least that is available in both C++ or Python.
(I don't want to use PyGame - too primitive and frustrating as a game engine.)
A simple game alone probably wouldn't teach "maximize cohesion minimize coupling" very well. Perhaps a game in which they implement the AI strategy? That might have complex enough algorithms. Maybe we could even play their AI's against each other.
Maybe a turn-based game like Civilization? (A primitive form of it, of course.)

You're definitely on the right track with your project scope but high school students can pay attention to large scale text based games.  I have had great success having them implement Blackjack.  This project is large by nature but you can place restrictions on how they solve the problem.  I've found that using three classes helps cut down on confusion.

The card class creates a single card object for use in the deck class
The deck class creates a deck of 52 cards made of card objects, also includes a shuffle and dealTopCard method
The hand class lets them actually deal a hand to themselves and play against a simple computer (the AI is simple to program)

I give this problem to AP CSA students in two parts, the deck and card classes with methods, and the hand class with functional game parts.
For higher level students, I give an open ended problem to algorithms & data structures kids where they need to write an algorithm that will procedurally generate a solvable (and interesting) puzzle.  It forces them to do their own research while implementing core functionality to a game.  Typically slide puzzles work well because they can be represented in a 2d array.
Middle School students tend to lack the attention to work on and understand a large and complex program.  Drawing an animal with Python turtles or something similar can be a good way to show how quickly bad code can get out of hand.  Just mentioning Discord bot is a good way to grab attention.  Going through the steps of creating a bot that does something even as simple as outputting a link by chat command goes over very well.
I have plenty more examples but as a general rule, the more "out there" the program while having clearly defined instructions, the better it holds high school student's attention.


Software development vs universities and scientific papers In short: Does learning how to make software, have its place inside universities? If so which parts of it?
I was studying in a university in Russia. I don't want to name its name and location. I wanted to become a software developer. Following some people's advice I entered a faculty that was mostly about math. All its teachers are mathematicians. So most of our subjects were just different kinds of math. There also was some programming but much less. I was told by other students and teachers that how I pass Calculus and Algebra exams was the most important thing and that programming exams were unimportant at all. Many different teachers and students were saying that "a university does not need to teach programmers". They say that "it's not science" and "it's nothing but craftsmanship". During a defense of diploma people sometimes ask programmers something like "That's all interesting but that's not math so why it's a diploma work?"
When I talked with people who were actually working as software developers they were saying that "If you don't how to fix problems with Linux and don't know a single architecture pattern then as a programmer you are really nothing". They also said that "I wouldn't hire a developer who doesn't tell me that HP-UX is a bad OS when I mention it". In university we spent a single lecture on patterns(and not even all students but some) and none on Linux and other operating systems. And I knew literally nothing about HP-UX. I had to learn 90% of my skills myself via books, online-tutorials and documentation.
In our country IT is a very popular industry. Because of that the math faculty students are 90% wannabe programmers. Teachers really hate that as they want math to be popular again. They say that "computer science ate math"(That's citation of a teacher during a lesson, "Информатика съела математику"). The teachers despise us programmers. The employers in Russia prefer candidates with a degree but will gladly accept those without it. The students try to pass all exams only to have the degree, they don't care about subjects at all. They forget everything when they come out of a room after an exam. It's seems like students and teachers declared war against each other.
I left university without any degree. Now I work as JS-developer. I myself participate in interviews to hire new developers. I ask them about things like Single Responsibility Principle, how to write clean code and how to create indexes in SQL. I know that SRP is not a law of physics, it comes without a good scientific proof. But I need it from by workers.
The question is how do Universities in other countries approach teaching software development? Do they actually target it? Is actually becoming a real software developer that will be respected by employers and not a scientist is a valid goal for a university student?

Short answer: yes.
Disclaimer: I'm an Associate. Pr. of Computer Science in a University in France. We have several undergraduate and graduate programs that lead to bachelor and master's degree of Computer Science.
As the degree is about Computer Science, we do teach software engineering (among other topics : databases, networking, logic, architecture, compilers, ...).
Some applied program are very applied (the students are working in a company for the duration of their studies, switching every two or three weeks between their company and the lectures at the Uni).
A computer science curriculum where one learns about software development is quite standard (from working with several colleagues from around the world I now that such things exist in the US, UK, most of Europe, Asia, Australia, …).


Is it okay to teach C++ to my 7 year old brother? I was thinking this for quite long, should i teach my little brother about programming in the age of 7-8? Because it will help him in the future in 12th standard and in university life. I want him to learn C++, Java, Html.

What do you think should i start teaching him or let him grow more till 10 or 12?

I want to tack on to Buffy's answer by focusing on one line from your question: "I want him to learn C++,Java,Html" (emphasis added).

The bigger question should be "What does he want to learn?"

Part of the beautiful challenge that is teaching is getting students to want to learn what we want to teach them. What has your brother shown interest in? What has he told you that he wants to learn? What are his hobbies? How could something about those hobbies be expressed/constructed in a program? Above all else, where do his interests align with what you can teach him?

I'd encourage you to read this thread about starting students in Python, this thread on engagement with computing, this thread about programming languages for teenagers (shout out to Processing!), and our recent HNQ about the age at which students should begin learning programming.

Make it fun and engaging for him. Have him build a game, one that he himself would want to play. The language skills will come with time (and intellectual maturity). What you can do now is two-fold: pique his interest for the future and teach him the essential concepts of computational thinking that underpin programming in any language.


Thoughts on copying and pasting code? I'm curious to hear people's experiences with allowing (or disallowing) students to use copy and paste in code when learning as beginners.

I feel like there are two kinds of copy/pasting.

Copying code you found somewhere in docs or on the internet and pasting it into your code
Utilizing copy paste with your own code to write similar code more quickly

I see some upsides and downsides to both, so I'm wondering what other instructors have learned.

e.g.

Upside to allowing it. It's a useful tool for moving quickly and everyone who writes code professionally would use it.
Downside: students who are beginners could really use the practice typing everything out
Downside: it makes it much easier to copy code you find somewhere without needing to understand it.

What are other instructors' experiences and insights? Do you allow your students to use copy and paste?

I let the kids cut and paste code but with the following caveats:

They must cite the source (be it a classmate, another student or a site like StackOverflow)
There has to be enough of their project that is their own code to show mastery of whatever the assignment's all about
At times, I encourage them to use others code (and libraries) to enhance their projects, that is, add features that they otherwise wouldn't have had


Assessing programming skills of students under 18 years While there's plenty of existing material and resources to help you decide on the next techie to hire, I could find very little for assessing the skill of children/teenagers at programming. This is the only proposal that I've found, but it's been created by a private company.

My question regards standards for general knowledge in programming, so there are no specific language requirements - it could be based on pseudo-code.

What high-quality standards are out there?

There are four places I would suggest looking if your concern is the K-12 environment:

ISTE Standards (Note: there are standards here for multiple audiences, including students, teachers, and computer science educators)
CSTA Standards
AP CS Principles Course Description (Revised for 2017-18)
AP CS A Course Description

These would probably be the best places to start. I suggest working your way from the top down since the standards as listed progress in what I see as an increasing order of complexity/rigor.


Resubmitting Projects How do y'all decide when to allow a student to resubmit an assignment rather than just taking a low grade?

I have 3 things that tend to pop up when projects get turned in.

Wrong Thing: Student turns in starter code, an earlier version of their project, or the entirely wrong files.

Wrong Files: I mostly teach Java and there are always a handful of students that turn in the .class files instead of .java files. It's not the same students each time, so I assume it's an honest mistake.

Cheating:: Yeah, there's always a few.

I teach high school and tend to allow resubmissions when it's clear that what they turned in doesn't match up with what they're capable of. But I think part of that may be from the pressure in high schools to not fail anyone.

I'm also asking more about larger scale projects and not just lab style assignments. Projects that might have a significant affect on their averages.

The cheating issue is real, and it caused me to rethink how I approached labs entirely. I think of them as learning laboratories now, and don't give them a tremendous weight in grades (though I do spend a huge amount of time grading them, as I grade during code interviews.)

If you want some context for my approach, I have previously outlined some of the ways that I think about lab work here, here, and here.

In general, though, I come to the grading with the expectation that there will be many rounds of refactoring.

This year, I started a new procedure, and it has worked very well for me and my students. It utilizes my school's SMS (we use PowerSchool, though I imagine that any online grading system would have similar functionality.)

At our first code interview for a lab, I walk through their code in depth with them, and ask them to explain their approach (big picture) to me verbally. If they start  walking through their code like by line, I stop them and ask for "just an overview". They are allowed to look at their code as they talk, but I don't want a play by play. (Students who have trouble with this raise some potential red flags for cheating.)

I also create a wish-list of comments as I go. "It would be better if you...", or "This code is not clearly written because...". I notate all of these in the comment field for the lab's grade.

As the interview gets to an end, I put on my best unforgiving professor hat, and award a rather punitive grade. So now, the student hasa 33% (or some other vileness.)

Then, in the comments section of the grade, I put on my kindest professor hat, and imagine what grade I would give if they came back in week with all of the problems fixed. Students with better initial labs might wind up with higher grades here, but everyone has rather high grades available.(*) I also leave in the list of problems that should be fixed.

Now, the students have to come back to me with the problems all fixed to receive the higher grade.  I can draw this proccess out as much as I want in order to ensure that my students produce beautiful, clean code. I don't change the grade to the higher one until the code is wonderful. (This may take several attempts.)

(*) - Not cheaters. If you work through my extremely forgiving system and still cheat, I will give you a zero for that section with no way to make it up.


How to motivate game design/development students to do more than the minimum on homework I'm a teaching assistant for the upper level under-graduate courses for Game Design and Development at my University, and the professor and I are having a hard time finding a way to motivate students to:

Actually complete and turn in their homework on time.
Attempt to do more than just the bare minimum.
Listen to feedback for on-going assignments.

We have tried things like offering a bit of extra credit for turning it in on time or going above and beyond on the assignment, but as you can assume the only students that actually get that extra credit are the ones that are already excelling.

These classes are built around building a strong portfolio, but what generally comes out are projects that I wouldn't even want to include in my portfolio. Generally about 15% of the class are students that do work that deserve an A, and the rest is split fairly evenly between a C and an F (F's generally fall around 30% for these students).

I appreciate your feedback and thoughts, hopefully with the help of this community I can help motivate these students to excel.

Edit: Adding more to the 3rd bullet above. They have an assignment one week, and they get feedback on what they need to do to improve their marks. However, they ignore the feedback and end up losing the same amount of points they did the previous week for the same problem.

Edit2: Answering some comments here. This is in the United States and they are working in C# with Unity3D. The class has pre-requisites that do funnel nicely to the content, because they start with just learning the basics of C# then they learn more complicated computer science concepts in C# all while learning simple game design using gamemaker, which can essentially be a drag and drop tool. It isn't until around the second semester of Sophomore year that they start using Unity3D. As for the games they are creating, please feel free to take a look at my portfolio: http://ryandarras.weebly.com/examples-of-work.html.
These are games I made throughout my undergrad, and while I'll admit I'm a big nerd that probably spent way too much time on my homework because I enjoyed it, I would expect a resemblance to this quality in their games. Homework is also given with a very detail description of the requirements, as well as the exact rubric that is used to grade the assignment (the rubric is as objective as we can make it).

Something I wasn't sure about when I was reading your post was if the problem is whether the issue is if students lack motivation or if they lack the ability to succeed in your course.

If 30% of your students are consistently failing your course, then I genuinely do have to wonder if the latter is the case. If so, I'm not sure this is a  problem you can easily fix within just within the context of your course.

For example, I'm assuming the students are expected to complete a few pre-reqs before they can take your course. Why aren't those pre-reqs adequately preparing your students? Etc.

If the students are genuinely under-prepared and have "given up" and are just going through the motions so they can graduate, then the best fix is probably to try and systematically repair your entire department. Perhaps that might mean finding more ways to add in support (especially in the intro courses), making sure students know where to find support, raising the bar on core classes...

It could also be the case that the pre-reqs listed for your course aren't actually enough, and that you need to add another pre-req class or two to make sure your students are prepared.

If it's the former (your students are capable but simply aren't motivated), then here are some thoughts:

  We have tried things like offering a bit of extra credit for turning it in on time or going above and beyond on the assignment

Offering extra credit for going above-and-beyond is entirely normal and expected, but I think offering extra credit for turning assignments is counter-productive: it sets the expectation that turning in assignments late is ok, further normalizing that behavior.

In fact, if you're lenient about lateness, it would be stupid for a student to not take advantage of that leniency. The student is probably pretty busy/juggling a bunch of classes and other responsibilities, so naturally they'd want to use whatever advantage they can get.

Instead, I would institute a strict no-late-work policy (perhaps with some mild leniency -- give students a fixed number of late days they can use or something).

  Attempt to do more than just the bare minimum.

Same sort of thing as before -- if you're a busy student, then it makes sense that you'd do only the bare minimum needed to pass the class. In particular, the students probably aren't thinking of the work they need to turn in as the "bare minimum": they're probably thinking they're turning in exactly what's expected.

In that case, one thing you can do is to raise your expectations. Make the assignments harder, or (if there's room for creativity on the assignments) show students examples of good projects other students have completed in the past. Maybe tell students that they're required to complete at least one item from the "above and beyond" section (though they're free to chose which one they want to do).

You can also perhaps try motivating the students in other ways by explicitly telling your students that the purpose of this class is to help them build a portfolio they can show employers so they should put their best foot forward.

Making the assignments more interesting, as ctrl-alt-delor suggests, would also help. Making your assignments group-work might also help (and help partially compensate for the added difficulty).

  Listen to feedback for on-going assignments.

Getting students to listen to feedback is always challenging. I would first double-check that:

You aren't overwhelming the students with feedback -- if you give too much, they tend to ignore it altogether (I learned this the hard way).
The students are actually aware that they're given feedback, and that they're expected to read it. I'm not sure how exactly you're returning feedback, but if it's through some website, perhaps that website's UX is bad.
They're aware that the feedback contains info they're supposed to apply/contains warnings of things you're going to continue deducting points for.

Beyond that, I suggest telling the students about the "growth mindset vs fixed mindset" thing, as ctrl-alt-delor expects.

A somewhat more blunt tactic would be to modify each assignment (apart from the first one) and ask students to answer a question about their feedback -- something like "Summarize the feedback you were given on the last assignment. How did you apply what you learned while reading that feedback on this current assignment?". Basically, force them to at least think about their feedback, instead of avoiding it.


Starting open source How can I best get students started with an open source project that they would be interested in and welcomed to? I'd prefer that the project is focused on building a piece of software, perhaps a command line based one. My students are high schoolers and are interested mainly in Python, though they are open to exploring other languages.

(I'm self-teaching, but this is rephrased as if I was teaching a class.)

Since you specifically mention high-schoolers getting started with open source, i have to recommend the Google Code-In. I participated all 4 years as a high-schooler and really learned a lot about open source.

The contest essentially has a dozen or so open-source organizations provide "bite-size" tasks. Each task is mentored, so the students have someone specific to ask questions of. There are both coding tasks and non-coding tasks (documentation, QA, outreach).

The contest itself lasts for only a month and a half (December-January), but the hope is that people get into it and stick around with the open-source projects they contributed to. Many of the grand prize winners do exactly that. See, for example, this blog post by one of the 2014 winners. You can also read my blog post, though i didn't win.

For university students, there is the Google Summer Of Code, which is a similar idea with a rather different format. You must apply to be accepted, and do a single large task, and get paid a stipend.


Use of jshell in AP CS A I recently installed jshell in my IDE for use in demoing concepts in AP CS A. It came at just the right time as it was a powerful way to teach ArrayLists and its associated methods required for the AP CS A Exam. Rather than having to compile, run, change, repeat, I could demo the methods dynamically and instantly show students the results in something closer to real time.

As I look ahead both to exam preparation and to next year's iteration of the course, I am wondering how others have used it and where it has been successful for student learning.

What topics in the AP CS A curriculum are best suited to instruction via jshell?

I have found jshell to be very useful.  It can be used to inspect classes quickly and easily.  You can import any standard library class.  You can also import user-generated classes using the /open command.  It can be very helpful in generating test cases.  You can save your explorations to a file by entering /save foo.jsh.  You can place them in a main method and you have documented the vulnerabilities in the class you created, so if something goes wrong down the road, you know where you don't have to look.

I found it very helpful for teaching about workhorse classes such as the wrapper classes, BigInteger, and ArrayList.   It also came in handy for teaching about polymorphism and interfaces.

It will be a valuable asset in the toolbox in my classes.


Deep Learning Teaching Resources What would you recommend as the best resources for learning and teaching about Deep Learning?  These could include tools (e.g. TensorFlow), tutorials, books (e.g. Deep Learning), MOOCs (e.g. Udacity's), etc.

I'm working to put together a list of best resources for an upcoming issue of AI Matters. What I'm looking for is the best of the best entry points into an understanding of deep learning. Nothing even so specific as convolutional networks is necessary. As an educator, I am motivated to collect and share the best first footholds for giving students and professionals a start for the mighty climb that is highly motivated by recent achievements. As far as audience, I envision undergraduate intro AI through adult professional.

The first thing that must be discussed in the matter, is the mathematics involved.

Deep learning is first and foremost a mathematical model. An overview of this big subject is given quite well in its Wikipedia article. The page showcases a summary of the subject, as well as links to more resources (2 birds in 1 go).

To explain the mathematical model, I recommend reading this article. This gives a relatively good basis of understanding for neural networks (which are a "supertype" of deep learning algorithm). Afterwards, page 4 of the article is a good place from which to progress towards Deep learning. For example, the neural network in the image from that page:

But what if we had more than 1 hidden layer? Now that's classified as deep learning.

A short google search for "deep learning neural networks" gives this handy website. It, too, gives a brief summary of the mathematics, increasing understanding.

After reading these articles and that website, you and your students should be good to go, and start gaining hands-on experience. Usually, the basic example for a deep learning algorithm is to fit a linear function to a dataset of points.

Another article (again, found through google search) explains the subject with more specific information. I recommend reading it to gain greater understand of the subject.

Because links sometimes go broken, it might be a good idea to download those articles (they are pdf files). Then again, they were found with straight forward google searches, so that's more reliable, especially in such a quickly evolving field.


Common questions students may ask when they learn OOP? Reading this question Do we really need OO languages to manage software complexity? on one of SE sites and my own experiences in teaching object-oriented concept, e.g. Some real practical example to teach object-oriented concepts and programming (in python) has kept me wondering what are common questions students may ask when they first learn OOP ?
For example in that question the author asked,

I am a beginning CS student ... In the first semester we were introduced to OOP concepts like encapsulation,  data hiding, modularity ...
But I think all the principles used to manage complexity like
modularity, encapsulation, data hiding and so on can be very easily
implemented by procedural languages. So why really OOP if we can
manage complexity without it?

I also have to admit that I have own struggle, e.g I asked this question Does OOP overemphasize the importance of noun and thus put action/verb in the less importance position ？ on that site too (no student has asked me this question though). My question was closed and even got 2 delete votes but that is alway my concern.
If my students or my colleagues who have experience with javascript and like to learn OOP, I will always let them compare momentjs with date-fns, both deal with date and provide the similar functions, both do a good job, but momentjs an OOP library and date-fns is a function library.
My purpose is let them understand there are more than one ways to do things.
So what are common questions your students ask ?

I read through most voted questions tagged object oriented on softwareengineering.stackexchange.com and stackoverflow.com. I feel some questions on  softwareengineering site are quite common when learning OOP while questions on stackoverflow are more related to practical programming questions that are more likely asked by professionals.
So I listed some questions from softwareengineering site,

Why is it good to split a program into multiple classes?. This question was indeed asked by a high school student.
Do objects in OOP have to represent an entity?. My students do ask me this question.
What's the benefit of object-oriented programming over procedural programming? this one is somewhat related to the "manage software complexity" question in my question and I do discuss with my colleagues another interesting question that was asked on quora How does Linux maintain such a large code base when C isn't an object oriented language? Is the code base all messed up?
Does OOP fulfill the promise of code reuse? What alternatives are there to achieve code reuse? I am not sure if students will ask this question and I have my own double to the question too.
When writing object-oriented code, should I always be following a design pattern?. This site also has a question about design pattern, How bad is a Computer Science course that doesn't teach Design Patterns?
Explanation on how “Tell, Don't Ask” is considered good OO. Only after they gain some coding experiences can they ask/appreciate the question. But it is a good one.
Should I create a class if my function is complex and has a lot of variables? One answer there was also my recommendation to my students when they have such question, "Use a class, but also provide a free standing function, that only constructs the object, calls the method and returns the result, the class that you use internally really becomes just an implementation detail of your public function"

Quora also has some interesting questions I feel people will ask when they first learn OOP, I list some here:

Can anyone (in a programmer's position) survive in the modern tech industry (software or no software) without OOP?
How often do software developers use OOP?. One answer there by Kurt Guntheroth is interesting "Any time you write a program longer than about 1,000 lines, you should use OOP. 1000 lines? Why’s that ...?"
When is object-oriented programming not a good fit?

Hopefully I can get some other answers.


Teaching Critical Thinking In answers to a previous question, a few people suggested intro programming with true novices might not be the best place to introduce critical thinking/planning skills for programs. To me, intro programming is the perfect place - many of these skills relate to the ideas of breaking problems down (which tie in nicely with loops), abstraction (e.g., methods/classes), and so on. Particularly with many students only taking intro programming as part of a degree for an unrelated field (e.g., physics, math) in the hopes of being able to do some application-based work, I feel that students would benefit from these skills for such projects.

I am certainly open to be convinced on this topic! Should these skills be explicitly taught in a CS curriculum? If so, where?

First, Critical Thinking is a deep concept and in a first course only simple aspects of it can be taught. To explore the depth of it you need to have context and a novice, by definition, has little of that. See Wikipedia for a start on understanding how broad and deep Critical Thinking really is.

To me, the most important question to be answered by Critical Thinking is "What should be built?" (and what not built). But a novice has no basis on which to answer such a question. They have enough to do to try to understand what can be built at the start, so you can only give a glimpse of the deeper questions then.

I would suggest that any true education explore Critical Thinking in many ways and in many courses - philosophy, history, .... And that later in the CS curriculum the topic be taken up, again in several courses/classes to explore its complete depth.

However, the detail in your question seems to indicate that you are more interested in Deep Thinking rather than Critical Thinking as such. I'm a big believer in teaching problem decomposition and abstraction from the first days. My courses delay if and while constructs for as long as I can manage while the students think about abstraction and polymorphism. I don't always do it, but prefer to teach recursive thinking before loops and polymorphism before selection. That is true even in a course in Java. It doesn't require Scheme.

But some aspects of critical thinking are useful to novices. For example, the idea that if what you are doing isn't working, then do something different. Also "Ask for help" when you are stuck. "Don't make assumptions" is another good idea that can be taught fairly early. "Test your assumptions."

Ultimately you want them to use evidence based decision making, of course rather than wishful or magical thinking, but that, as I said above, requires context and some "seasoning." Novices are naturally focused on the "how" rather than the "what" - especially the "what is appropriate" and "what is important."


Teaching Other Markup Languages I've been spending a lot of time lately using both $\LaTeX$ and Markdown and have found them incredibly useful. Some colleagues were blown away by some work I'm doing with $\LaTeX$. The more I think about my own use of them, the more I think about teaching/learning markup languages on a general level.

What are the merits of teaching languages like $\LaTeX$ and Markdown in a computer science class? Are they appropriate there?

I have seen the personal and professional value of these languages, but I'm wavering on if and how they fit into a formal CS course. (HTML is obviously relevant for its intrinsic connection to web development, so my question is really focused on other languages like the two aforementioned ones.)

Next year I'm planning on having some of my second and third year students build an API that can then be used by students in our mobile development classes, and possibly web development classes.

Hadn't thought of this before reading your post, but I think I may have part of the requirements be that they write documentation for the API so that the other classes can use it without having direct interaction with the authors. Since git, and specifically GitHub, is part of the task it makes sense that the documentation should be written in markdown. Seems like a good excuse to go over it in class.

A couple years ago I had a student that started teaching themselves Latex as part of an independent project. His goal was to create a calculus equation solver. He did fairly well learning Latex, but I'm not sure how I would go about bridging that in to a full class project.


Teaching Arduino---but not just "monkey see monkey do" I've been looking for peer instruction style questions for an intro to Arduino workshop, but I haven't found anything. Besides not seeing PI materials, it's hard to find any materials where a student has to self-explain their own knowledge or discuss with classmates. Most resources are in a tutorial style where the student is expected to essentially copy a given configuration. I'm worried that this will lead to low understanding and not change students' misconceptions.

I want materials that ask students to discuss their understanding of

How an LED light works
How digital pins are different than analog pins
How code is sent and stored on the Arduino board
What functions like digitalWrite() and setup() actually do
Ideally, given that you know so far, how would you _____ ?

Do you know of any such materials for Arduino?

This sounds a little bit like an X-Y problem. When you're using micro controllers in a computer science class, what is it that you're trying to teach? How to write a for/while loop to satisfy an abstract line of pseudo-code, or the joy of making yourself something that previously you have only seen as an expensive gimmick in a shop?

I think there are similarities in science practicals. There, there is a precise script to follow, and often not much scope for 'now make up your own experiment to mix random chemicals'. What you're teaching is (a) a re-enforcement of the theoretical work through application and repetition, and (b) the practical, hands on skills of real development.

What we do in the real world (particularly in the embedded device space) really is find someone else's description of what they did, then copy it and make sure you can also get it to work. Finally, you make your own version better. Along the way, you learn lots of vitally important practical skills. Assembling the project isn't the only goal, it's almost an excuse for the activity.

Debugging is harder. The 'debug by random iteration' approach won't work.
Results are tangible - you can hold them. You can flash lights, react to stimulus, move things. This teaches students about real applications, not just web pages and databases.
MCUs are more resource constrained. You can make optimisation a necessary part of the task, not just a pointless exercise.
Each student will put their own twist on the exercise, drawing in other skills.

Picking out the current micro:bit ideas on twitter:

Robot Football
NeoPixel Clock
An optical indicator for a S/W project (I think, was a bit unclear)
Arcade game on a 5x5 display

If I'm interviewing, I can ask about one of these projects, what was hard, what was interesting, what comes next. That tells me something about a candidate that no 20 minute coding test will. All of these projects would take any of us here some time to complete too.

If I gave you an arduino and a kit of hardware, I'd say 'do the blink LED exercise first', to make sure you know how things behave when they work. Then a few more simple follow on activities. Jumping straight in at the deep end is too big a step - we set up commercial products just the same too, with easy step-by-step instructions (plus videos). People still come back with questions - our first question is always 'does binky work?'


How to prepare students for bias in industry I teach at Mills, a women's college near Silicon Valley with a high number of students of color. We do a great job of preparing students technically -- they do very well on the job market and then in their jobs. What I am unsure of is how to prepare students for the transition from a nurturing, feminist liberal arts environment to industry, which is not only more rough-and-tumble for everyone but can include bias based on sex, race, age, etc., which may cause them to leave the tech industry.

How can I prepare my students to not have their careers derailed by mistreatment in industry? I don't want to just scare them out of the major or make them fearful by mentioning discrimination without providing a solution.

[I asked the question. Even though I don't have the full answer, I want to share what we do, in case it is helpful.]

Role Models

Throughout the entire graduate and undergraduate programs, there are female professors and guest speakers, including women of color. In lecture, I highlight the work of all types of people.

Connecting Students to Support Communities

When surveying students at the beginning of the semesters to get their preferred name, contact information, pronouns, etc., I ask them to optionally provide demographic information that can help me match them with conferences and special programs for which they are eligible.

We encourage students to attend the Grace Hopper Celebration of Women in Computing, the ACM Richard Tapia Celebration of Diversity in Computing, Lesbians Who Tech summits, AlterConf, etc., and we subsidize their attendance. In some cases, faculty attend with them.

Fighting the Impostor Syndrome

I educate students about the Impostor Syndrome, repeatedly. I tell them that it is normal to feel overwhelmed and incompetent at times. It does not mean they don't belong in CS; it means they're being challenged. When I correct students' mistakes, I let them know that I've made the mistake too.

Direct Discussion

When an event is in the news and on students' minds, such as the publication Susan Fowler's essay about Uber, I mention it in class and provide context. (On the negative side, her experience was awful. On the positive side, people are listening to her, which would not have been the case in the past.)

In the capstone course this spring, I assigned students the following readings (which, in hindsight, were overwhelming):

Why is Silicon Valley So Awful to Women? by Liza Mundy, The Atlantic
Monthly, April 2017.
Reflecting On One Very, Very Strange Year at Uber by Susan J. Fowler, February 19, 2017.
Silicon Valley's not-so-secret bias: Ageism by Jon Swartz, USA Today, September 15, 2016.
Squarespace staffer claims exec told them "you’re so black, you blend into the chair" by Rob Beschizza, March 15, 2016.
Woman in Tech Tweets About Sexist Dudes in Tech. Dude Gets Fired. Internet Meltdown Ensues by Lindy West, Jezebel, March 21, 2013. [I chose this article for the summary of events, not the subsequent analysis. I told students they could stop reading after Richards' firing.]
Ask For A Raise? Most Women Hesitate
by Jennifer Ludden, All Things Considered, February 8, 2011.

I asked them to write a one-page essay with their reactions to the readings and suggested the following optional questions:

Are you concerned about your work environment after Mills?
Have
people ever told you it will be easier or harder for you to get hired
because of your sex, race, age, or other non-work-related
characteristic? Do you think they are right?
Why do you think people
sometimes stay so long in bad work situations?
Have you or anyone you
cared about experienced mistreatment in the workplace? Was it
remedied?
Have you ever negotiated a job offer or raise? How did you
feel about your experience?
Are there other articles on these topics
that you've read and would recommend? If so, cite and summarize them.

Their answers allowed me to discuss their specific concerns with them individually and in class. For example, some women of color worried that they would be given jobs for which they were not qualified, either directly from companies or through special programs targeting minorities. I let them know that I (a white woman from an upper-class background) got my first programming job through family connections: I was qualified for it, but there's no way I would have been considered (fresh out of high school) without connections. If their families lack connections (which is overwhelmingly the case for my students), they should take advantage of other ways to get a foot in the door, paying it forward later.

Alumnae Examples

On the day we discussed the above readings, a recent graduate came to speak about her job and how she successfully advocated for herself, such as not letting herself get interrupted and telling people when they attributed to someone else an idea that she had originally suggested.

Pre-coaching for Industry

I advised students that they should maintain a network inside and outside their company, keep their resume up-to-date, and save some of their money (if possible) so they can move if necessary. If a bad situation arises, they should consult their support network for perspective/affirmation, document everything offsite, and not blindly trust HR or management. I let them know they could also come to us any time for advice.

Career Counseling

When students are considering accepting jobs, I steer them to companies with good reputations for their treatment of people like them and where we have alumnae or friends in mid-level or senior positions who can help them. If a student gets an offer from a company I don't know, I use my network (LinkedIn, Systers, etc.) to find out the company's reputation.


Discrete function is also a math function? Here is a table of the Staten Island subway:

| STOP | STATION         |
|------+-----------------|
|    1 | St. George      |
|    2 | Tomkinsville    |
|    3 | Stapleton       |
|    4 | Clifton         |
|    5 | Grasmere        |
|    6 | Old Town        |
|    7 | Dongan Hills    |
|    8 | Jefferson       |
|    9 | Grant           |
|   10 | New Dorp        |
|   11 | Oakwood Heights |
|   12 | Bay Terrace     |
|   13 | Great Kills     |
|   14 | Eltingville     |
|   15 | Annadale        |
|   16 | Hugenot         |
|   17 | Prince’s Bay    |
|   18 | Pleasant Plains |
|   19 | Richmond Valley |
|   20 | Arthur Kill     |
|   21 | Tottenville     |

and here is an Elisp function that maps a number to a name:

(defun sisubstops (s)
  (pcase s
    ((guard (or (< s 1) (> s 21))) (message "Hey, just stops 1 through 21, please!"))
    ('1 (message "St. George"))
    ('2 (message "" Tomkinsville))
    ('3 (message "Stapleton"))
    ('4 (message " Clifton"))
    ('5 (message " Grasmere"))
    ('6 (message " Old Town"))
    ('7 (message " Dongan Hills"))
    ('8 (message " Jefferson"))
    ('9 (message " Grant"))
    ('10 (message " New Dorp"))
    ('11 (message " Oakwood Heights"))
    ('12 (message " Bay Terrace"))
    ('13 (message " Great Kills"))
    ('14 (message " Eltingville"))
    ('15 (message " Annadale"))
    ('16 (message " Hugenot"))
    ('17 (message " Prince’s Bay"))
    ('18 (message " Pleasant Plains"))
    ('19 (message " Richmond Valley"))
    ('20 (message " Arthur Kill"))
    ('21 (message " Tottenville"))))

So, when I'm trying to tell students that this is a function of a basically non-continuous phenomenon, i.e., we're not dealing with a function like f(x) = x^2, rather a function that matches stops to names -- but it is still a function -- how can I get this across? One idea would be to got deep into Lambda Calculus and talk about how LC does conditionals. My first goal is to distinguish between continuous versus discrete; and yet I've written a Lisp function that can't really be represented as any sort of normal math function e.g., S(n) = M*nwhere M is some sort of machine or constant that takes a stop number and turns it into a stop name. Any ideas how, yes, this is a function? Or is this just a misnomer, i.e., comp-sci using/abusing the term function. So yes, how is sisubstops really a function?

Focus on the idea that the sets can be finite. They don't need to be defined by a formula. Any set of ordered pairs is a relation. If there is a unique second element for any given first element then it is a function.

For example, the set of pairs {(5,2), (5,4)} is not a function, since the value associated with 5 is not unique. This is a relation: a set of ordered pairs.

But {(5,2), (6,2)} IS a function since the value associated with 5 is unique and the same is true of 6. It is a constant function, by the way, since all values map to 2.

Additionally {(5, 2), (6, 3)} is a function and its inverse is {(2, 5), (3, 6)} which is also a function. Thus the original here is called invertible.

You don't need Lambda Calculus or any mathematics to show what a function is. Finite functions can be computed by table lookup or by hash maps. An array is a function from a certain set of integers to some other set (the values).

Actually functions defined by formulas in computing are often problematic since computations of many values (say Real Values) are only approximate.