# (guest@joequery.me)~ $| # Self assessment strategies for beginner developers There has never been a better time to learn how to program. The industry is still longing for qualified candidates, and unlimited resources are available online - many of them free. But even though the amount of information regarding how to program is at an all-time high, the amount of content that adequately assesses the knowledge of the reader is still disproportionately low. ## The need for self assessment As I have discussed before, the ability to "follow along" with a tutorial in no way means you understand the material enough to apply it. Quality assessments, quizzes, and assignments aid in the mastery of material. Very, very few resources online provide an adequate level of assessment. Codecademy, for example, is generally accepted by professional programmers as only a way to learn what programming is, not how to program. The assessments Codecademy provides are far too simplistic and involve too much hand holding. In my opinion, the objective of Codecademy seems to be to get students through lessons rather than evaluating true understanding. Even the highest quality content you can pay for online generally does not include exercises to measure student mastery. Even modern programming books, which are more comprehensive and generally of higher quality, rarely provide exercises to help the reader confront gaps in understanding. Unfortunately, the burden is on you, new programmer, to self-assess your understanding both honestly and accurately. ## You don't know what you don't know The most difficult part of self-assessment is simply identifying what you don't know. A novice at any skill will have an extremely difficult time determining whether they understand what they have supposedly learned. For example, a novice self-taught piano student may believe they have mastered chords just by being able to press the right keys. However, the student's technique may be poor. If the student is ignorant to correct technique, they will have no way of accurately measuring their progress. The main complaint among professional developers regarding self-taught programmers or programmers who have attended programming bootcamps is the lack of programming fundamentals these programmers generally tend to exhibit. Knowledge of modern frameworks is meaningless if the programmer cannot read code, debug code, or translate real world problems into source. ## Self assessment strategies The following self-assessment strategies are broad enough to apply to nearly any programming subject you will encounter in your path. If you wish to stand out among the hundreds of starry-eyed developers-to-be rushing to the industry, you must force yourself to create your own assignments that implement these strategies. ## Reading comprehension The following techniques will help ensure reading comprehension of programming subject material. Use these techniques as you read through an article, a tutorial, or a book. ### Memorizing terminology If you come across a term you do not recognize, create a flashcard for it. I prefer physical flashcards so you can keep them by the toilet and study for a couple of minutes whenever you use the bathroom. It might sound silly, but it works. If you come across a term you might recognize but it's used in a specific technical context, create a flashcard. Go through the entire set of flashcards once a week. Make as many flashcards as you need - don't be lazy. ### Creating real world scenarios When learning a new programming concept or technique, create 10 real world scenarios that can be represented by the concept or technique. For example, if you are learning about if/else if/else statements, an example real world scenario could be If it is cold and raining outside, wear a raincoat. If it's not cold but it's raining, wear a poncho. If it's not raining but cold, wear a hoodie. Otherwise wear a t-shirt. Then translate the scenario you created into source code using what you've learned in the material. For example: var outfit; var temperature = 'cold'; var condition = 'clear'; if(temperature == 'cold' && condition == 'raining'){ outfit = 'raincoat'; } else if(condition == 'raining'){ outfit = 'poncho'; } else if(temperature == 'cold'){ outfit = 'hoodie'; } else{ outfit = 't-shirt'; } console.log("Since it's " + temperature + " and " + condition + ", I'll wear a " + outfit);  Be sure to run the source code to make sure it actually works!!! ### Example tweaks For every single example provided in the material you're reading/watching, force yourself to make a substantial tweak to the example. This ensures you know what each component of the example does. Example tweaks you can make are: • Changing the values used in the example. This can be as simple as changing an example involving "dogs" to "cats". Or seeing what happens if an$85$is considered an A in a class as opposed to a$90$. • Incorporating a previously learned concept into the example. Understand how the two concepts can interact. Be creative here. Make the examples fun, silly, or relevant to your interests. Being able to take the structure of an example and successfully apply a different real-world scenario to it is extremely valuable! For example, suppose we have been provided demo code that assigns a letter value to a grade for a student's test. var letter_grade; var student_grade = 88; if(student_grade >= 90){ letter_grade = 'A'; } else if(student_grade >= 80){ letter_grade = 'B'; } else if(student_grade >= 70){ letter_grade = 'C'; } else{ letter_grade = 'F'; } console.log("The student scored a " + student_grade + ", which is a " + letter_grade);  After reading this example, you could ask yourself: Can I tweak this code to incorporate the letter grade of D if the student scored between 60 and 69? Forcing yourself to make these small adjustments to example code is extremely critical in solidifying understanding of the subject matter. ### Line by line code audit When reading through example source code, you should be able to do the following for each line of code: 1. Explain what the line of code does 2. Explain why you think the author believes the line of code is necessary 3. Explain what would happen if that line of code was removed ### Repetition, repetition, repetition While many people will tout that programming is glorified googling, I thoroughly believe one thing that separates good programmers from mediocre programmers is proficiency and familiarity with their toolkit. This idea ties in with using flashcards to memorize terminology. For every example you come across, you should be able to recreate the example from scratch from pure memory. No references, no google. If you mess up recreating the example, examine what you forgot and start over. I recommend typing out the example yourself while lat least twice While I of course advocate deep theoretical understanding of all concepts encountered, I also advocate it is extremely important to become intimately familiar with the code structure that accompanies the concept. If you have to constantly look up the syntax for declaring a Class, you will interrupt your flow and thus your productivity. In a whiteboard interview, your theoretical understanding of concepts will be undermined if you fail to perform basic tasks due to unfamiliarity with code structure. ### Kill your ego The absolute most important thing you should do as a new programmer is to NEVER, EVER, EVER just accept an example or explanation you don't understand. Many new programmers will simply nod their head in agreement with something they don't understand to avoid feelings of inadequacy. If a new programmer encounters a concept or explanation they don't understand, their inclination is to avoid their insecurity or fear of not being smart enough to learn programming by glazing over the material they find difficult and moving on to the next subject. This is the ego in full force. Do not let your ego get in the way of your education. If you do not understand a concept, chances are your struggles have nothing to do with your ability to comprehend the material anyway. What do I mean by that? Much of the programming content available was written, not surprisingly, by programmers. But what might come as a surprise is that a good programmer is not necessarily a good educator. Education is a skill that requires practice and fine-tuning, a fact that many programmers overlook. Consequently, many of the programming resources you will consume may do a poor job of explaining certain concepts or justifying certain practices. Be willing to raise your hand if you have a question and say you don't understand. As a self-learner, the person you are raising your hand to will be yourself. You wouldn't ignore someone else who has a question, so don't ignore yourself. Being able to openly and honestly identify what you don't understand is a critical component to the learning process. ### Attempt to interpret official documentation Many programming tutorials will provide only a rudimentary introduction to certain programming constructs. To demonstrate, consider this example code from Tizag's MySQL query tutorial. <?php // Make a MySQL Connection mysql_connect("localhost", "admin", "1admin") or die(mysql_error()); mysql_select_db("test") or die(mysql_error()); // Retrieve all the data from the "example" table$result = mysql_query("SELECT * FROM example")
or die(mysql_error());

// store the record of the "example" table into $row$row = mysql_fetch_array( $result ); // Print out the contents of the entry echo "Name: ".$row['name'];
echo " Age: ".\$row['age'];

?>


The tiny example above makes use of many functions in PHP, including

• You will become more familiar with industry terminology
• If you come across terminology you don't recognize in the official documentation, research it and make a flashcard!
• You may become more acquainted with the bigger picture in how the function is used
• You may realize you didn't actually understand how the function worked.
• If you realized you don't understand how mysql_query works, for instance, you can now go look outside the official documentation for more examples and explanations

Thus when reading programming tutorials, take time to look up the official documentation for whatever is included in the examples. Knowledge depth may not provide the instant gratification factor that resources like Codecademy thrive on, but knowledge depth gives you the foundation that will set you apart.

## Creating assignments

So you've used the self-assessment strategies while reading the material - that's great! Now to seal the deal and truly solidify your understanding of the material, you must create assignments that push yourself.

### Assignments

An effective assignment contains the following sections:

• Repetition section
• Conceptual section
• Application section

#### Repetition

The assignment should start with a repetition section. Create problems that require the student (that's you!) to perform many similar variations of the examples provided in the reading. Improving memorization and familiarity is the objective of this section. We want the tools learned to be deeply ingrained so the student (that's you!) does not have to revisit the lesson.

#### Conceptual

Next, the assignment should provide conceptual questions with both coding and free response answers. An important component of conceptual question is to confront misconceptions. If you believed a programming concept worked one way but later discovered it worked differently, create a question that forces you to describe just how they were different.

These questions should ask the student to explain snippets of code and to create small snippets of code that represent specific situations.

#### Application

The assignment should end with at least two application problems. Application problems should consist of real-world scenarios that need solving. For example:

A veterinarian office needs a program to keep track of appointments.

Application problem descriptions should not include technical details. Phrases such as "use SQL to..." or "Use an array to..." should be avoided. Clients or project managers will not ask you to use Arrays or Strings to solve their problems.

By creating these application problems, you force yourself to consider what real-world problems you're able to solve with the material you are learning.

## Why go through all of this trouble?

If you are able to create assignments that

• force the student to commit common programming idioms to memory
• force the student to explain potentially confusing or misleading concepts
• apply the knowledge gained from the reading to real world situations

Then you have almost certainly mastered the material yourself.