Programming outcomes

From

(Difference between revisions)
Jump to: navigation, search
(Add Fall 2017 notes)
(handoff)
Line 1: Line 1:
-
These are my ([[User:Robertsurton|Robertsurton]]) notes based on the Fall 2016 discussion of PSU's web of topics.
+
=Programming=
-
The following outcomes are all existentially quantified over languages and tool sets (compiler, debugger, editor, etc.); that is, any combination of language and tool set is acceptable for achieving the ASOT-CS, although a school accepting it for transfer may require students to demonstrate the same level of proficiency in a particular language or using a particular tool set.
+
The following outcomes are existentially quantified over language and tools; that is, if a student demonstrates this level of proficiency in any language using any set of tools, a school may accept that for awarding the ASOT-CS, while a school accepting the ASOT-CS for transfer may require a student to demonstrate proficiency in a particular language or using particular tools.
-
Some outcomes were seen as better belonging to CS 160, which will reappear and be applied in the programming sequence. They include:
+
==Write and execute a program.==
-
* ethics
+
-
* designing algorithms
+
-
* problem solving
+
-
* requirements and specification of non-programming problems
+
-
Some outcomes drew discussion and therefore seem to be the points on which schools differ:
+
* Write a program using tools such as an editor and version control system.
-
* be able to learn a new language quickly for a particular task (e.g. problem, project, or class)
+
* Execute a program using tools such as an interpreter, compiler or build system, and console.
-
* unit testing
+
* Decompose a program into modules at a source file level. Organize source files in a filesystem, using any relevant language features (e.g. including headers or importing modules) and build systems (e.g. separate compilation, library linking, or make).
-
* call-by-value, call-by-reference
+
* Write and execute some introductory program, such as hello world, from experience, without external references.
-
* OOP
+
* Recognize important tools and language features for quickly learning a new language or translating.
-
** using
+
* Distinguish being able to write code to do a task from using language/library features for the task fluently, and be able to choose and justify the choice.  Know how those provided features are implemented as far as necessary to understand implications of the choice.
-
** creating
+
-
* tool use
+
-
** debugger
+
-
** reference documentation
+
-
** IDE
+
-
* memory
+
-
** dynamic memory management
+
-
** references
+
-
** linked lists
+
-
The tool use and memory discussion seem to be challenges because of the desire for language/toolset agnosticism, since the details (and which details seem natural to cover) depend so much on those choices.  My impression of the purpose of the memory topics is to prepare a student to take data structures without spending a lot of time learning about references and linked structures.
+
==Discuss computing problems among humans.==
-
==Continuing notes (rough draft status) Fall 2017==
+
* Use language reference documentation, tutorials, style guides, fora, IRC, mailing lists, user groups, conferences, etc.
-
 
+
-
The following outcomes are existentially quantified over languages and tool sets (compiler, debugger, editor, etc); that is, any combination of language and tool set is acceptable for achieving the ASOT-CS, although a school accepting it for transfer may require students to demonstrate the same level of proficiency in a particular language or using a particular tool set.
+
-
 
+
-
===Write and execute a computer program.===
+
-
 
+
-
* Write and execute some trivial program, such as hello world, from scratch by memory. ''there is some question of what trivial means and at what level it is memorized, i.e. syntactic vs being able to reconstruct from principles''
+
-
* Use toolchain components such as compiler, interpreter, text editor, command line, or IDE.
+
-
* Recognize important pieces of toolchain/documentation for quickly learning a new language or translating.
+
-
 
+
-
===Justify trust in a program's correctness.===
+
-
 
+
-
* Debug programs.
+
-
** Recognize common static errors from the compiler, including syntax errors, and recall common solutions.
+
-
** Simulate a program's steps mentally or in writing to peform snapshot analysis and predict behavior.
+
-
** Run a program under a debugger to observe computations and isolate unexpected behavior.
+
-
** Add assertions and logging to a program to observe computations and isolate unexpected behavior.
+
-
* Test programs.
+
-
** Interact with a program in order to confirm expected behaviors and attempt to trigger faults.
+
-
** Write an automated test to confirm an expected behavior or correct handling of exceptional conditions.
+
-
** Combine automated tests into a test suite.
+
-
** Perform unit testing by writing automated tests that isolate each program module.
+
-
** Perform test-driven development by writing tests for requirements before modifying a program to satisfy those requirements.
+
-
* Handle program errors.
+
-
** Recognize common runtime errors.
+
-
** Distinguish logic errors, such as a programmer's mistake, from exceptional conditions, such as a file not existing.
+
-
** Detect and handle exceptional conditions within a program. ''by return type, exceptions, etc''
+
-
* Modify a program's source to add or subtract features, modify it to work in another environment, etc. ''maintenance''
+
-
 
+
-
===Communicate programming challenges among humans using source code and documentation.===
+
-
 
+
-
* Use language reference documentation and tutorials.
+
* Value consistent programming style.
* Value consistent programming style.
* Consistently use a personal programming style.
* Consistently use a personal programming style.
-
* Be able to adapt programming style to a group project.
+
* Adapt programming style to a group project.
-
* Explain requirements, design decisions, and coding decisions, in internal comments, in external documentation, and in conversation with people.
+
* Explain requirements, design decisions, and coding decisions, using source code (variable names, conventions, etc.), programming comments, documentation, and in conversation with people.
-
 
+
* Read other people's code and get meaning from it.
-
===Reason about abstraction, modularity, and separation of concerns.===
+
* Recognize important pieces of documentation for quickly learning a new language or translating.
-
 
+
-
* Decompose a program into modules at a source file level, using separate compilation.
+
-
===Represent and manipulate information related to a real-world problem domain in the context of a computer program.===
+
==Reason about values in a program.==
* Distinguish a value, a location that stores a value, and an identifier that names a location or value.
* Distinguish a value, a location that stores a value, and an identifier that names a location or value.
* Determine whether an identifier in a program is a variable, which might hold more than one value over the running of the program, or a constant, which always has a fixed value.
* Determine whether an identifier in a program is a variable, which might hold more than one value over the running of the program, or a constant, which always has a fixed value.
 +
* Assign appropriate scope and lifetime to each variable in a program.
* Analyze an identifier for type, that is, the set of values it might hold and properties all those values have in common.
* Analyze an identifier for type, that is, the set of values it might hold and properties all those values have in common.
* Recall the type annotations used by the programming language and apply them correctly to identifiers in a program.
* Recall the type annotations used by the programming language and apply them correctly to identifiers in a program.
 +
 +
==Represent the data from a real-world problem domain within a program.==
 +
* Recall the primitive data types built into the language or commonly available through standard libraries.
* Recall the primitive data types built into the language or commonly available through standard libraries.
* For each primitive data type, recall the syntax and meaning of common operations on them.
* For each primitive data type, recall the syntax and meaning of common operations on them.
* Represent the Boolean values (true and false), acquire Booleans from predicates such as relations on other types, combine Booleans using logical connectives, and use them in control structures.
* Represent the Boolean values (true and false), acquire Booleans from predicates such as relations on other types, combine Booleans using logical connectives, and use them in control structures.
-
* Organize data in sequential data structures, including one-dimensional arrays, two-dimensional arrays, and structures/named tuples/objects.
+
* Manipulate bits within larger numeric representations using bitwise operators, masking, shifting, etc.
-
* Organize data in linked data structures, such as a linked list. ''This is a point of controversy; what is enough background for DSA?''
+
* Compute with numbers, including natural numbers, integers, and rational numbers as represented in the language and standard libraries.
-
* Store references to data, such as with a pointer whose value represents another identifier, or a reference that is an alias for another identifier.
+
** "Simple numerical algorithms, such as … approximating the square root of a number, or finding the greatest common divisor." ''from ACM''
-
* Discuss techniques for sorting and searching (e.g. binary search in array, insertion sort).
+
** Clamp between two boundary values.
-
* Discuss memory as a resource.
+
** Division with remainder.
-
* Assign appropriate scope and lifetime to each variable in a program.
+
** Random numbers—implementing from scratch, using language/library, and using; distinguish pseudo/truly random, handle seeding, basic distribution/range adjustment.
 +
** Interpolate between values.
 +
** ''draw numeric operations from C standard library, IEEE floating point, Gnu Scientific Library, Gnu MultiPrecision library, R, Matlab, Mathematica''
 +
** Handle idiosyncracies such as wraparound, IEEE floating point comparisons, NaN, etc.
 +
* Use the algebraic sum and product datatypes provided by the language, such as record, struct, tuple, named tuple, enum, union, object's attributes, optional/maybe.
 +
* Organize and operate on textual data (i.e. strings).  Handle issues of text encoding, character sets generally, Unicode.
 +
* Use the sequential data structures provided by the language.
 +
* Use the mapping data structures provided by the language, including maps/dictionaries and records/structures/named tuples/objects.
 +
* Organize data in linked data structures, such as a linked list. ''Where is the division between programming and DSA?''
 +
* Store references to data, such as with a pointer whose value represents another identifier, or a reference that is an alias for another identifier. Reason about aliasing.
-
===Connect a program to its environment, such that information can be input and output.===
+
==Connect a program with its environment.==
-
* Access arguments and options provided when a program is run. ''i.e. command-line arguments''
+
* Access arguments and options provided when a program is run, i.e. command-line arguments and environment variables.
* Format program values into textual messages.
* Format program values into textual messages.
-
* Parse textual input into program values. ''e.g. with regular expressions?''
+
* Parse textual input into program values.
* Read and write textual messages on standard streams such as a console.
* Read and write textual messages on standard streams such as a console.
* Read and write files in external storage.
* Read and write files in external storage.
-
''Also important at some point, but probably not here, is formatting and parsing binary-formatted external files.''
+
==Apply structured programming principles.==
-
 
+
-
''Other possibilities: Interact with a document that provides context for the program through a DOM.  Read and write messages over a network protocol.  Share information with other programs through an IPC mechanism.  Provide a GUI.''
+
-
 
+
-
===Apply structured programming principles.===
+
* Decompose a program into blocks of sequential code, functions, and procedures.
* Decompose a program into blocks of sequential code, functions, and procedures.
** Identify entrances to and exits from a procedure or block.
** Identify entrances to and exits from a procedure or block.
-
** Return values from a function.
 
** Pass arguments into a function or procedure.
** Pass arguments into a function or procedure.
-
** Discuss the difference between calling conventions, including call-by-value and call-by-reference.
+
** Return values from a function.
-
** Recognize recursive functions and compare recursion to iteration.
+
** Discuss calling conventions, including call-by-value and call-by-reference.
-
* Distinguish statements from expressions.
+
** Recognize recursive functions and compare recursion with iteration.
-
* Recall the statements built into the language.
+
** Justify the choice to implement a function iteratively or recursively.
-
* Use selection statements, such as if/then, if/then/else, switch/select/case, and pattern matching.
+
** Rewrite tail calls using iterative code and vice versa.
-
** Nest selection statements, and when possible un-nest them by manipulating their conditions.
+
* Distinguish statements and expressions.
 +
* Recall the kinds of statements built into the language.
 +
* Analyze the effect of a statement in terms of pre- and post-conditions.
 +
* Use conditional/selection statements, such as if/then, if/then/else, switch/select/case, and pattern matching.
 +
** Nest conditional statements, and flatten nested conditionals by manipulating their conditions.
* Use iteration/repetition/looping statements, such as while, for, do/while, and foreach.
* Use iteration/repetition/looping statements, such as while, for, do/while, and foreach.
 +
** Repeat a statement a particular number of times.
 +
** Iterate over items by index, i.e. a counting loop.
** Use iterator/generator constructs provided by the language.
** Use iterator/generator constructs provided by the language.
-
** Recognize common looping patterns and kinds of traversal.
+
** Loop under the control of multiple conditions, e.g. when searching until a particular item is found or the end of the possibilities is reached.
-
*** Repeat a statement a particular number of times.
+
** Structure a loop-and-a-half to handle complex stepping, or to poll user input with validation.
-
*** Search a list for an item, stopping the iteration when it is found.
+
** Identify and verify loop invariants.
-
**** Search a list for an item, allowing for the possibility that it is not found.
+
** Rewrite loops using loop fission/fusion, unrolling, permutation, etc.
-
*** Process all items in a list.
+
-
**** Bound a loop by the count of items in a list.
+
-
**** Bound a loop by a sentinel item in a list.
+
-
**** Use a foreach loop if it is provided by the language.
+
-
*** Iterate over list items by index.
+
-
*** Iterate over list items by stepping, for example with an iterator.
+
-
*** Structure a loop-and-a-half to handle complex stepping, or to poll user input with validation.
+
-
*** Accumulate all items in a list, allowing for an empty list.
+
-
** Determine from a loop's source what its initial condition and invariant are.
+
-
===Apply object-oriented programming principles.===
+
==Apply object-oriented programming principles.==
* Decompose a program into a class hierarchy and interacting objects.
* Decompose a program into a class hierarchy and interacting objects.
Line 130: Line 89:
** Make code extendable and reusable using inheritance and polymorphism.
** Make code extendable and reusable using inheritance and polymorphism.
* Effectively use libraries written using object-oriented principles.
* Effectively use libraries written using object-oriented principles.
 +
 +
==Apply generic programming principles.==
 +
 +
* Perform STL-style analysis of generic programming issues such as types of iterators (repeatable, reversible, random access, readable, writable, etc.).
 +
* ''Stepanov belongs here''

Revision as of 11:05, 21 September 2019

Contents

Programming

The following outcomes are existentially quantified over language and tools; that is, if a student demonstrates this level of proficiency in any language using any set of tools, a school may accept that for awarding the ASOT-CS, while a school accepting the ASOT-CS for transfer may require a student to demonstrate proficiency in a particular language or using particular tools.

Write and execute a program.

  • Write a program using tools such as an editor and version control system.
  • Execute a program using tools such as an interpreter, compiler or build system, and console.
  • Decompose a program into modules at a source file level. Organize source files in a filesystem, using any relevant language features (e.g. including headers or importing modules) and build systems (e.g. separate compilation, library linking, or make).
  • Write and execute some introductory program, such as hello world, from experience, without external references.
  • Recognize important tools and language features for quickly learning a new language or translating.
  • Distinguish being able to write code to do a task from using language/library features for the task fluently, and be able to choose and justify the choice. Know how those provided features are implemented as far as necessary to understand implications of the choice.

Discuss computing problems among humans.

  • Use language reference documentation, tutorials, style guides, fora, IRC, mailing lists, user groups, conferences, etc.
  • Value consistent programming style.
  • Consistently use a personal programming style.
  • Adapt programming style to a group project.
  • Explain requirements, design decisions, and coding decisions, using source code (variable names, conventions, etc.), programming comments, documentation, and in conversation with people.
  • Read other people's code and get meaning from it.
  • Recognize important pieces of documentation for quickly learning a new language or translating.

Reason about values in a program.

  • Distinguish a value, a location that stores a value, and an identifier that names a location or value.
  • Determine whether an identifier in a program is a variable, which might hold more than one value over the running of the program, or a constant, which always has a fixed value.
  • Assign appropriate scope and lifetime to each variable in a program.
  • Analyze an identifier for type, that is, the set of values it might hold and properties all those values have in common.
  • Recall the type annotations used by the programming language and apply them correctly to identifiers in a program.

Represent the data from a real-world problem domain within a program.

  • Recall the primitive data types built into the language or commonly available through standard libraries.
  • For each primitive data type, recall the syntax and meaning of common operations on them.
  • Represent the Boolean values (true and false), acquire Booleans from predicates such as relations on other types, combine Booleans using logical connectives, and use them in control structures.
  • Manipulate bits within larger numeric representations using bitwise operators, masking, shifting, etc.
  • Compute with numbers, including natural numbers, integers, and rational numbers as represented in the language and standard libraries.
    • "Simple numerical algorithms, such as … approximating the square root of a number, or finding the greatest common divisor." from ACM
    • Clamp between two boundary values.
    • Division with remainder.
    • Random numbers—implementing from scratch, using language/library, and using; distinguish pseudo/truly random, handle seeding, basic distribution/range adjustment.
    • Interpolate between values.
    • draw numeric operations from C standard library, IEEE floating point, Gnu Scientific Library, Gnu MultiPrecision library, R, Matlab, Mathematica
    • Handle idiosyncracies such as wraparound, IEEE floating point comparisons, NaN, etc.
  • Use the algebraic sum and product datatypes provided by the language, such as record, struct, tuple, named tuple, enum, union, object's attributes, optional/maybe.
  • Organize and operate on textual data (i.e. strings). Handle issues of text encoding, character sets generally, Unicode.
  • Use the sequential data structures provided by the language.
  • Use the mapping data structures provided by the language, including maps/dictionaries and records/structures/named tuples/objects.
  • Organize data in linked data structures, such as a linked list. Where is the division between programming and DSA?
  • Store references to data, such as with a pointer whose value represents another identifier, or a reference that is an alias for another identifier. Reason about aliasing.

Connect a program with its environment.

  • Access arguments and options provided when a program is run, i.e. command-line arguments and environment variables.
  • Format program values into textual messages.
  • Parse textual input into program values.
  • Read and write textual messages on standard streams such as a console.
  • Read and write files in external storage.

Apply structured programming principles.

  • Decompose a program into blocks of sequential code, functions, and procedures.
    • Identify entrances to and exits from a procedure or block.
    • Pass arguments into a function or procedure.
    • Return values from a function.
    • Discuss calling conventions, including call-by-value and call-by-reference.
    • Recognize recursive functions and compare recursion with iteration.
    • Justify the choice to implement a function iteratively or recursively.
    • Rewrite tail calls using iterative code and vice versa.
  • Distinguish statements and expressions.
  • Recall the kinds of statements built into the language.
  • Analyze the effect of a statement in terms of pre- and post-conditions.
  • Use conditional/selection statements, such as if/then, if/then/else, switch/select/case, and pattern matching.
    • Nest conditional statements, and flatten nested conditionals by manipulating their conditions.
  • Use iteration/repetition/looping statements, such as while, for, do/while, and foreach.
    • Repeat a statement a particular number of times.
    • Iterate over items by index, i.e. a counting loop.
    • Use iterator/generator constructs provided by the language.
    • Loop under the control of multiple conditions, e.g. when searching until a particular item is found or the end of the possibilities is reached.
    • Structure a loop-and-a-half to handle complex stepping, or to poll user input with validation.
    • Identify and verify loop invariants.
    • Rewrite loops using loop fission/fusion, unrolling, permutation, etc.

Apply object-oriented programming principles.

  • Decompose a program into a class hierarchy and interacting objects.
    • Implement constructors and destructors.
    • Make code extendable and reusable using inheritance and polymorphism.
  • Effectively use libraries written using object-oriented principles.

Apply generic programming principles.

  • Perform STL-style analysis of generic programming issues such as types of iterators (repeatable, reversible, random access, readable, writable, etc.).
  • Stepanov belongs here
Personal tools
MediaWiki Appliance - Powered by TurnKey Linux