├── docs ├── projects │ ├── guides │ │ ├── README.md │ │ └── content.md │ ├── .gitignore │ ├── media │ │ ├── clear_quirk.png │ │ ├── hint_example.png │ │ ├── jupyter_tags.png │ │ ├── reset_quirk.png │ │ ├── context_example.png │ │ ├── r_tests_example.png │ │ ├── intructions_example.png │ │ ├── project_tag_mapping.png │ │ ├── r_solution_example.png │ │ ├── sample_code_example.png │ │ ├── narrative_task_example.png │ │ ├── notebook_task_example.png │ │ ├── python_tests_example.png │ │ ├── python_solution_example.png │ │ ├── narrative_notebook_location.png │ │ ├── first_task_instructions_example.png │ │ └── topics.csv │ ├── projects-examples.md │ ├── projects-good-project.md │ ├── old │ │ ├── projects-vision.md │ │ ├── projects-examples.md │ │ └── projects-usp.md │ ├── projects-test-examples.md │ ├── README.md │ └── projects-narrative-format.md ├── courses │ ├── exercises │ │ ├── markdown-exercise.md │ │ ├── examples │ │ │ ├── md │ │ │ │ ├── python │ │ │ │ │ ├── TabExercise.md │ │ │ │ │ ├── BokehServerExercise.md │ │ │ │ │ └── BulletExercise.md │ │ │ │ ├── shell │ │ │ │ │ ├── MultipleChoiceExercise.md │ │ │ │ │ ├── ConsoleExercise.md │ │ │ │ │ ├── TabConsoleExercise.md │ │ │ │ │ └── BulletConsoleExercise.md │ │ │ │ ├── nolang │ │ │ │ │ ├── VideoExercise.md │ │ │ │ │ └── PureMultipleChoiceExercise.md │ │ │ │ ├── r │ │ │ │ │ ├── RStudioMultipleChoiceExercise.md │ │ │ │ │ ├── NormalExercise.md │ │ │ │ │ ├── BulletExercise.md │ │ │ │ │ ├── RcppExercise.md │ │ │ │ │ ├── MultipleChoiceExercise.md │ │ │ │ │ └── TabExercise.md │ │ │ │ ├── misc │ │ │ │ │ ├── RcppExerciseWithFiles.md │ │ │ │ │ ├── ConsoleExerciseWithFiles2.md │ │ │ │ │ ├── ConsoleExerciseWithFiles1.md │ │ │ │ │ ├── ShinyExerciseWithFiles.md │ │ │ │ │ └── TabConsoleExerciseWithFiles3.md │ │ │ │ └── sql │ │ │ │ │ ├── MultipleChoiceExercise.md │ │ │ │ │ ├── NormalExercise.md │ │ │ │ │ ├── BulletExercise.md │ │ │ │ │ └── TabExerciseWithMultipleChoice.md │ │ │ └── ipynb │ │ │ │ ├── python │ │ │ │ ├── VideoExercise.ipynb │ │ │ │ └── MultipleChoiceExercise.ipynb │ │ │ │ └── r │ │ │ │ └── NormalExercise.ipynb │ │ ├── all-exercise-types │ │ │ ├── README.md │ │ │ ├── title.md │ │ │ ├── hints.md │ │ │ ├── success-message.md │ │ │ └── learning-objective.md │ │ ├── technical-details │ │ │ ├── sct.md │ │ │ ├── README.md │ │ │ ├── xp.md │ │ │ ├── exercise-headers.md │ │ │ ├── unified-authoring-api.md │ │ │ └── exercise-blocks.md │ │ ├── video-exercises │ │ │ ├── review-rubric.md │ │ │ ├── README.md │ │ │ ├── slides.md │ │ │ └── scripts.md │ │ ├── console-exercise.md │ │ ├── multiple-choice-exercises │ │ │ └── review-rubric.md │ │ ├── bullet-exercise.md │ │ ├── normal-exercises │ │ │ └── review-rubric.md │ │ └── README.md │ ├── spreadsheets │ │ ├── images │ │ │ ├── course_page.png │ │ │ ├── chapter_page.png │ │ │ ├── report_issue.png │ │ │ ├── chapter_page_workbook.png │ │ │ └── course_page_add_chapter.png │ │ ├── exercises │ │ │ ├── images │ │ │ │ └── content_guidelines.png │ │ │ ├── content-guidelines.md │ │ │ ├── sample.md │ │ │ ├── general.md │ │ │ ├── solution.md │ │ │ └── meta.md │ │ ├── technology.md │ │ ├── limitations.md │ │ ├── other_exercises.md │ │ ├── other_exercises │ │ │ ├── multiple-choice.md │ │ │ ├── video.md │ │ │ └── pure-multiple-choice.md │ │ ├── exercises.md │ │ ├── course-structure.md │ │ └── README.md │ ├── design │ │ ├── examples │ │ │ └── README.md │ │ ├── technical-help-resources.md │ │ ├── brainstorming-mistakes.md │ │ ├── brainstorming-jargon.md │ │ ├── brainstorming-problems.md │ │ ├── brainstorming-concepts.md │ │ ├── overview-prerequisites.md │ │ └── choose-learner-personas.md │ ├── guidelines │ │ ├── README.md │ │ ├── course-naming.md │ │ └── style.md │ └── README.md ├── images │ ├── Mytasks.png │ ├── Comments.png │ ├── TabExercise.png │ ├── mobile │ │ ├── image.png │ │ ├── play-store.png │ │ ├── tabs-file.png │ │ ├── image-context.png │ │ ├── image-small.png │ │ ├── select-code.png │ │ ├── select-output.png │ │ ├── select-table.png │ │ ├── tap-one-blank.png │ │ ├── feedback-wrong.png │ │ ├── tabs-file-open.png │ │ ├── tabs-file-small.png │ │ ├── tap-multi-blank.png │ │ ├── play-store-small.png │ │ ├── reorder-multi-line.png │ │ ├── select-code-small.png │ │ ├── select-table-small.png │ │ ├── tabs-dataset-file.png │ │ ├── tabs-dataset-table.png │ │ ├── feedback-wrong-small.png │ │ ├── image-context-small.png │ │ ├── reorder-one-solution.png │ │ ├── select-output-small.png │ │ ├── tabs-file-open-small.png │ │ ├── tap-one-blank-small.png │ │ ├── multi-choice-one-option.png │ │ ├── reorder-multi-solutions.png │ │ ├── tabs-dataset-file-small.png │ │ ├── tabs-dataset-table-open.png │ │ ├── tap-multi-blank-small.png │ │ ├── multi-choice-multi-option.png │ │ ├── reorder-multi-line-small.png │ │ ├── tabs-dataset-table-small.png │ │ ├── reorder-one-solution-small.png │ │ ├── multi-choice-one-option-small.png │ │ ├── reorder-multi-solutions-small.png │ │ ├── tabs-dataset-table-open-small.png │ │ └── multi-choice-multi-option-small.png │ ├── Asana-mytasks.png │ ├── Asana-subtasks.png │ ├── Asana-timeline.png │ ├── BulletExercise.png │ ├── NormalExercise.png │ ├── VideoExercise.png │ ├── Welcome Email.png │ ├── Assigning-people.png │ ├── courses │ │ ├── intro-sql.png │ │ ├── teach-dashboard.png │ │ ├── teach-dashboard-add-course.png │ │ └── teach-dashboard-course-list.png │ ├── Asana-project-view.png │ ├── Assigning-duedates.png │ ├── ConsoleExerciseShell.png │ ├── NormalExerciseShell.png │ ├── Set-up-Asana-account.png │ ├── exercise-decision-tree.odg │ ├── exercise-decision-tree.png │ ├── interface │ │ ├── teach-editor.png │ │ ├── content-overview.png │ │ ├── teach-editor-nav-bar.png │ │ ├── content-overview-build-example.png │ │ ├── content-overview-build-status.png │ │ └── teach-editor-upload-assets-interface.png │ ├── Completing-tasks-in-Asana.png │ ├── MultipleChoiceExerciseR.png │ ├── TabConsoleExerciseShell.png │ ├── TabStackedNormalExercise.png │ ├── projects │ │ ├── projects-screen.png │ │ └── handwashing-project.png │ ├── BulletConsoleExerciseShell.png │ ├── MultipleChoiceExerciseShell.png │ ├── challenges │ │ ├── pandas-challenge.png │ │ ├── review_first_view.png │ │ └── review_second_view.png │ ├── prerequisites │ │ ├── 1-join-github.png │ │ ├── 3-complete-github.png │ │ ├── 2-select-github-plan.png │ │ ├── create-datacamp-account.png │ │ └── link-teach-authorize-github.png │ ├── PlainMultipleChoiceExerciseR.png │ ├── RStudioMultipleChoiceExercise.png │ ├── PlainMultipleChoiceExerciseShell.png │ └── premium-courses │ │ └── slide-editing-mode.png ├── datacamp-example-contract.pdf ├── challenges │ ├── content │ │ ├── images │ │ │ ├── BlanksChallenge.png │ │ │ ├── OutputChallenge1.png │ │ │ ├── OutputChallenge2.png │ │ │ ├── MultipleChoiceChallenge.png │ │ │ └── BlanksChallengeWithDistractors.png │ │ ├── examples │ │ │ └── r │ │ │ │ ├── MultipleChoiceChallenge2.md │ │ │ │ ├── BlanksChallengeDistractors.md │ │ │ │ ├── BlanksChallenge.md │ │ │ │ ├── MultipleChoiceChallenge1.md │ │ │ │ └── OutputChallenge.md │ │ ├── multiple-choice-challenge.md │ │ └── output-challenge.md │ ├── guidelines │ │ ├── README.md │ │ ├── content.md │ │ └── style.md │ ├── README.md │ └── review-mode.md ├── mobile │ ├── README.md │ ├── courses │ │ ├── exercises │ │ │ ├── select-code.md │ │ │ ├── select-output.md │ │ │ ├── select-table.md │ │ │ ├── reorder.md │ │ │ ├── tap.md │ │ │ └── multiple-choice.md │ │ └── README.md │ └── practice │ │ └── README.md ├── interface │ ├── create-content-dialog.md │ └── dashboard.md ├── faq │ └── README.md └── contract.md ├── static.json ├── .bookignore ├── Mytasks.png ├── Comments.png ├── Asana-mytasks.png ├── Asana-subtasks.png ├── Asana-timeline.png ├── Welcome Email.png ├── Assigning-people.png ├── Asana-project-view.png ├── Assigning-duedates.png ├── Set-up-Asana-account.png ├── Completing-tasks-in-Asana.png ├── welcome.md ├── getting-started.md ├── CITATION.md ├── styles └── website.css ├── authoring.Rproj ├── book.json ├── app.json ├── .gitignore ├── CONTRIBUTING.md ├── LICENSE.md └── package.json /docs/projects/guides/README.md: -------------------------------------------------------------------------------- 1 | # Projects 2 | -------------------------------------------------------------------------------- /static.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": "_book/" 3 | } 4 | -------------------------------------------------------------------------------- /docs/projects/.gitignore: -------------------------------------------------------------------------------- 1 | .httr-oauth 2 | *.docx 3 | -------------------------------------------------------------------------------- /.bookignore: -------------------------------------------------------------------------------- 1 | Dockerfile 2 | Jenkinsfile 3 | jenkins 4 | TODOS.md -------------------------------------------------------------------------------- /docs/courses/exercises/markdown-exercise.md: -------------------------------------------------------------------------------- 1 | # Markdown Exercise 2 | 3 | -------------------------------------------------------------------------------- /Mytasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/Mytasks.png -------------------------------------------------------------------------------- /Comments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/Comments.png -------------------------------------------------------------------------------- /docs/courses/exercises/examples/md/python/TabExercise.md: -------------------------------------------------------------------------------- 1 | # Tab Exercise 2 | 3 | @content -------------------------------------------------------------------------------- /Asana-mytasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/Asana-mytasks.png -------------------------------------------------------------------------------- /Asana-subtasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/Asana-subtasks.png -------------------------------------------------------------------------------- /Asana-timeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/Asana-timeline.png -------------------------------------------------------------------------------- /Welcome Email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/Welcome Email.png -------------------------------------------------------------------------------- /docs/courses/exercises/examples/md/python/BokehServerExercise.md: -------------------------------------------------------------------------------- 1 | # Bokeh Server Exercises 2 | -------------------------------------------------------------------------------- /Assigning-people.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/Assigning-people.png -------------------------------------------------------------------------------- /docs/courses/exercises/examples/md/python/BulletExercise.md: -------------------------------------------------------------------------------- 1 | # Bullet Exercise 2 | 3 | @content -------------------------------------------------------------------------------- /docs/courses/exercises/examples/md/shell/MultipleChoiceExercise.md: -------------------------------------------------------------------------------- 1 | # Multiple Choice Exercises 2 | -------------------------------------------------------------------------------- /Asana-project-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/Asana-project-view.png -------------------------------------------------------------------------------- /Assigning-duedates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/Assigning-duedates.png -------------------------------------------------------------------------------- /docs/images/Mytasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/Mytasks.png -------------------------------------------------------------------------------- /Set-up-Asana-account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/Set-up-Asana-account.png -------------------------------------------------------------------------------- /docs/images/Comments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/Comments.png -------------------------------------------------------------------------------- /docs/images/TabExercise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/TabExercise.png -------------------------------------------------------------------------------- /docs/images/mobile/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/image.png -------------------------------------------------------------------------------- /Completing-tasks-in-Asana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/Completing-tasks-in-Asana.png -------------------------------------------------------------------------------- /docs/images/Asana-mytasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/Asana-mytasks.png -------------------------------------------------------------------------------- /docs/images/Asana-subtasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/Asana-subtasks.png -------------------------------------------------------------------------------- /docs/images/Asana-timeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/Asana-timeline.png -------------------------------------------------------------------------------- /docs/images/BulletExercise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/BulletExercise.png -------------------------------------------------------------------------------- /docs/images/NormalExercise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/NormalExercise.png -------------------------------------------------------------------------------- /docs/images/VideoExercise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/VideoExercise.png -------------------------------------------------------------------------------- /docs/images/Welcome Email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/Welcome Email.png -------------------------------------------------------------------------------- /docs/images/Assigning-people.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/Assigning-people.png -------------------------------------------------------------------------------- /docs/images/courses/intro-sql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/courses/intro-sql.png -------------------------------------------------------------------------------- /docs/images/mobile/play-store.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/play-store.png -------------------------------------------------------------------------------- /docs/images/mobile/tabs-file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/tabs-file.png -------------------------------------------------------------------------------- /docs/datacamp-example-contract.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/datacamp-example-contract.pdf -------------------------------------------------------------------------------- /docs/images/Asana-project-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/Asana-project-view.png -------------------------------------------------------------------------------- /docs/images/Assigning-duedates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/Assigning-duedates.png -------------------------------------------------------------------------------- /docs/images/ConsoleExerciseShell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/ConsoleExerciseShell.png -------------------------------------------------------------------------------- /docs/images/NormalExerciseShell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/NormalExerciseShell.png -------------------------------------------------------------------------------- /docs/images/Set-up-Asana-account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/Set-up-Asana-account.png -------------------------------------------------------------------------------- /docs/images/mobile/image-context.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/image-context.png -------------------------------------------------------------------------------- /docs/images/mobile/image-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/image-small.png -------------------------------------------------------------------------------- /docs/images/mobile/select-code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/select-code.png -------------------------------------------------------------------------------- /docs/images/mobile/select-output.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/select-output.png -------------------------------------------------------------------------------- /docs/images/mobile/select-table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/select-table.png -------------------------------------------------------------------------------- /docs/images/mobile/tap-one-blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/tap-one-blank.png -------------------------------------------------------------------------------- /docs/projects/media/clear_quirk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/projects/media/clear_quirk.png -------------------------------------------------------------------------------- /docs/projects/media/hint_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/projects/media/hint_example.png -------------------------------------------------------------------------------- /docs/projects/media/jupyter_tags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/projects/media/jupyter_tags.png -------------------------------------------------------------------------------- /docs/projects/media/reset_quirk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/projects/media/reset_quirk.png -------------------------------------------------------------------------------- /docs/images/exercise-decision-tree.odg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/exercise-decision-tree.odg -------------------------------------------------------------------------------- /docs/images/exercise-decision-tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/exercise-decision-tree.png -------------------------------------------------------------------------------- /docs/images/interface/teach-editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/interface/teach-editor.png -------------------------------------------------------------------------------- /docs/images/mobile/feedback-wrong.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/feedback-wrong.png -------------------------------------------------------------------------------- /docs/images/mobile/tabs-file-open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/tabs-file-open.png -------------------------------------------------------------------------------- /docs/images/mobile/tabs-file-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/tabs-file-small.png -------------------------------------------------------------------------------- /docs/images/mobile/tap-multi-blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/tap-multi-blank.png -------------------------------------------------------------------------------- /docs/projects/projects-examples.md: -------------------------------------------------------------------------------- 1 | # Example projects 2 | 3 | WIP. Add when there are actually more live projects. 4 | 5 | 6 | -------------------------------------------------------------------------------- /welcome.md: -------------------------------------------------------------------------------- 1 | # Welcome 2 | 3 | 4 | 5 | #### References: 6 | 7 | https://www.datacamp.com/teach/documentation#tab_welcome -------------------------------------------------------------------------------- /docs/images/Completing-tasks-in-Asana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/Completing-tasks-in-Asana.png -------------------------------------------------------------------------------- /docs/images/MultipleChoiceExerciseR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/MultipleChoiceExerciseR.png -------------------------------------------------------------------------------- /docs/images/TabConsoleExerciseShell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/TabConsoleExerciseShell.png -------------------------------------------------------------------------------- /docs/images/TabStackedNormalExercise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/TabStackedNormalExercise.png -------------------------------------------------------------------------------- /docs/images/courses/teach-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/courses/teach-dashboard.png -------------------------------------------------------------------------------- /docs/images/mobile/play-store-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/play-store-small.png -------------------------------------------------------------------------------- /docs/images/mobile/reorder-multi-line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/reorder-multi-line.png -------------------------------------------------------------------------------- /docs/images/mobile/select-code-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/select-code-small.png -------------------------------------------------------------------------------- /docs/images/mobile/select-table-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/select-table-small.png -------------------------------------------------------------------------------- /docs/images/mobile/tabs-dataset-file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/tabs-dataset-file.png -------------------------------------------------------------------------------- /docs/images/mobile/tabs-dataset-table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/tabs-dataset-table.png -------------------------------------------------------------------------------- /docs/images/projects/projects-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/projects/projects-screen.png -------------------------------------------------------------------------------- /docs/projects/media/context_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/projects/media/context_example.png -------------------------------------------------------------------------------- /docs/projects/media/r_tests_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/projects/media/r_tests_example.png -------------------------------------------------------------------------------- /docs/images/BulletConsoleExerciseShell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/BulletConsoleExerciseShell.png -------------------------------------------------------------------------------- /docs/images/MultipleChoiceExerciseShell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/MultipleChoiceExerciseShell.png -------------------------------------------------------------------------------- /docs/images/challenges/pandas-challenge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/challenges/pandas-challenge.png -------------------------------------------------------------------------------- /docs/images/interface/content-overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/interface/content-overview.png -------------------------------------------------------------------------------- /docs/images/mobile/feedback-wrong-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/feedback-wrong-small.png -------------------------------------------------------------------------------- /docs/images/mobile/image-context-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/image-context-small.png -------------------------------------------------------------------------------- /docs/images/mobile/reorder-one-solution.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/reorder-one-solution.png -------------------------------------------------------------------------------- /docs/images/mobile/select-output-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/select-output-small.png -------------------------------------------------------------------------------- /docs/images/mobile/tabs-file-open-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/tabs-file-open-small.png -------------------------------------------------------------------------------- /docs/images/mobile/tap-one-blank-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/tap-one-blank-small.png -------------------------------------------------------------------------------- /docs/images/prerequisites/1-join-github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/prerequisites/1-join-github.png -------------------------------------------------------------------------------- /docs/projects/media/intructions_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/projects/media/intructions_example.png -------------------------------------------------------------------------------- /docs/projects/media/project_tag_mapping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/projects/media/project_tag_mapping.png -------------------------------------------------------------------------------- /docs/projects/media/r_solution_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/projects/media/r_solution_example.png -------------------------------------------------------------------------------- /docs/projects/media/sample_code_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/projects/media/sample_code_example.png -------------------------------------------------------------------------------- /docs/images/PlainMultipleChoiceExerciseR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/PlainMultipleChoiceExerciseR.png -------------------------------------------------------------------------------- /docs/images/RStudioMultipleChoiceExercise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/RStudioMultipleChoiceExercise.png -------------------------------------------------------------------------------- /docs/images/challenges/review_first_view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/challenges/review_first_view.png -------------------------------------------------------------------------------- /docs/images/challenges/review_second_view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/challenges/review_second_view.png -------------------------------------------------------------------------------- /docs/images/interface/teach-editor-nav-bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/interface/teach-editor-nav-bar.png -------------------------------------------------------------------------------- /docs/images/mobile/multi-choice-one-option.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/multi-choice-one-option.png -------------------------------------------------------------------------------- /docs/images/mobile/reorder-multi-solutions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/reorder-multi-solutions.png -------------------------------------------------------------------------------- /docs/images/mobile/tabs-dataset-file-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/tabs-dataset-file-small.png -------------------------------------------------------------------------------- /docs/images/mobile/tabs-dataset-table-open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/tabs-dataset-table-open.png -------------------------------------------------------------------------------- /docs/images/mobile/tap-multi-blank-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/tap-multi-blank-small.png -------------------------------------------------------------------------------- /docs/images/projects/handwashing-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/projects/handwashing-project.png -------------------------------------------------------------------------------- /docs/projects/media/narrative_task_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/projects/media/narrative_task_example.png -------------------------------------------------------------------------------- /docs/projects/media/notebook_task_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/projects/media/notebook_task_example.png -------------------------------------------------------------------------------- /docs/projects/media/python_tests_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/projects/media/python_tests_example.png -------------------------------------------------------------------------------- /docs/courses/spreadsheets/images/course_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/courses/spreadsheets/images/course_page.png -------------------------------------------------------------------------------- /docs/images/PlainMultipleChoiceExerciseShell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/PlainMultipleChoiceExerciseShell.png -------------------------------------------------------------------------------- /docs/images/mobile/multi-choice-multi-option.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/multi-choice-multi-option.png -------------------------------------------------------------------------------- /docs/images/mobile/reorder-multi-line-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/reorder-multi-line-small.png -------------------------------------------------------------------------------- /docs/images/mobile/tabs-dataset-table-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/tabs-dataset-table-small.png -------------------------------------------------------------------------------- /docs/images/prerequisites/3-complete-github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/prerequisites/3-complete-github.png -------------------------------------------------------------------------------- /docs/projects/media/python_solution_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/projects/media/python_solution_example.png -------------------------------------------------------------------------------- /docs/challenges/content/images/BlanksChallenge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/challenges/content/images/BlanksChallenge.png -------------------------------------------------------------------------------- /docs/challenges/content/images/OutputChallenge1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/challenges/content/images/OutputChallenge1.png -------------------------------------------------------------------------------- /docs/challenges/content/images/OutputChallenge2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/challenges/content/images/OutputChallenge2.png -------------------------------------------------------------------------------- /docs/courses/spreadsheets/images/chapter_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/courses/spreadsheets/images/chapter_page.png -------------------------------------------------------------------------------- /docs/courses/spreadsheets/images/report_issue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/courses/spreadsheets/images/report_issue.png -------------------------------------------------------------------------------- /docs/images/courses/teach-dashboard-add-course.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/courses/teach-dashboard-add-course.png -------------------------------------------------------------------------------- /docs/images/courses/teach-dashboard-course-list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/courses/teach-dashboard-course-list.png -------------------------------------------------------------------------------- /docs/images/mobile/reorder-one-solution-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/reorder-one-solution-small.png -------------------------------------------------------------------------------- /docs/images/premium-courses/slide-editing-mode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/premium-courses/slide-editing-mode.png -------------------------------------------------------------------------------- /docs/images/prerequisites/2-select-github-plan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/prerequisites/2-select-github-plan.png -------------------------------------------------------------------------------- /docs/projects/media/narrative_notebook_location.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/projects/media/narrative_notebook_location.png -------------------------------------------------------------------------------- /getting-started.md: -------------------------------------------------------------------------------- 1 | # Getting Started 2 | 3 | 4 | 5 | #### References 6 | 7 | https://www.datacamp.com/teach/documentation#tab_getting_started -------------------------------------------------------------------------------- /docs/images/mobile/multi-choice-one-option-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/multi-choice-one-option-small.png -------------------------------------------------------------------------------- /docs/images/mobile/reorder-multi-solutions-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/reorder-multi-solutions-small.png -------------------------------------------------------------------------------- /docs/images/mobile/tabs-dataset-table-open-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/tabs-dataset-table-open-small.png -------------------------------------------------------------------------------- /docs/images/prerequisites/create-datacamp-account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/prerequisites/create-datacamp-account.png -------------------------------------------------------------------------------- /docs/images/interface/content-overview-build-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/interface/content-overview-build-example.png -------------------------------------------------------------------------------- /docs/images/interface/content-overview-build-status.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/interface/content-overview-build-status.png -------------------------------------------------------------------------------- /docs/images/mobile/multi-choice-multi-option-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/mobile/multi-choice-multi-option-small.png -------------------------------------------------------------------------------- /docs/projects/media/first_task_instructions_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/projects/media/first_task_instructions_example.png -------------------------------------------------------------------------------- /docs/challenges/content/images/MultipleChoiceChallenge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/challenges/content/images/MultipleChoiceChallenge.png -------------------------------------------------------------------------------- /docs/courses/spreadsheets/images/chapter_page_workbook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/courses/spreadsheets/images/chapter_page_workbook.png -------------------------------------------------------------------------------- /docs/images/prerequisites/link-teach-authorize-github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/prerequisites/link-teach-authorize-github.png -------------------------------------------------------------------------------- /docs/courses/spreadsheets/images/course_page_add_chapter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/courses/spreadsheets/images/course_page_add_chapter.png -------------------------------------------------------------------------------- /docs/projects/guides/content.md: -------------------------------------------------------------------------------- 1 | # Project Content 2 | 3 | Use DataCamp's fork of IPython Nose for testing (it can be found at ). 4 | -------------------------------------------------------------------------------- /docs/images/interface/teach-editor-upload-assets-interface.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/images/interface/teach-editor-upload-assets-interface.png -------------------------------------------------------------------------------- /docs/challenges/content/images/BlanksChallengeWithDistractors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/challenges/content/images/BlanksChallengeWithDistractors.png -------------------------------------------------------------------------------- /docs/courses/spreadsheets/exercises/images/content_guidelines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datacamp/authoring/master/docs/courses/spreadsheets/exercises/images/content_guidelines.png -------------------------------------------------------------------------------- /CITATION.md: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | # Citation 4 | 5 | Please cite this documentation as: 6 | 7 | ``` 8 | DataCamp: "Authoring Content for DataCamp", 2017, https://github.com/datacamp/authoring. 9 | ``` 10 | -------------------------------------------------------------------------------- /styles/website.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css?family=Lato'); 2 | 3 | .book.font-family-1 { 4 | font-family: Lato; 5 | letter-spacing: 0px; 6 | } 7 | 8 | table.no-border td { 9 | border: none; 10 | } -------------------------------------------------------------------------------- /authoring.Rproj: -------------------------------------------------------------------------------- 1 | Version: 1.0 2 | 3 | RestoreWorkspace: Default 4 | SaveWorkspace: Default 5 | AlwaysSaveHistory: Default 6 | 7 | EnableCodeIndexing: Yes 8 | UseSpacesForTab: Yes 9 | NumSpacesForTab: 2 10 | Encoding: UTF-8 11 | 12 | RnwWeave: knitr 13 | LaTeX: XeLaTeX 14 | -------------------------------------------------------------------------------- /docs/courses/spreadsheets/technology.md: -------------------------------------------------------------------------------- 1 | # Technology 2 | 3 | At the moment our only supported technology is Google Sheets. Support for authoring Microsoft Excel 4 | courses will be added in the future. 5 | 6 | There are currently no plans for other technologies to be supported. 7 | -------------------------------------------------------------------------------- /docs/challenges/guidelines/README.md: -------------------------------------------------------------------------------- 1 | ## Guidelines 2 | 3 | We want DataCamp content to have as consistent a style and experience as possible. The articles in these sections list out how you should write your content, what writing style you should adopt, and how large content items should be. -------------------------------------------------------------------------------- /docs/courses/exercises/examples/md/nolang/VideoExercise.md: -------------------------------------------------------------------------------- 1 | ## Relational Operators 2 | 3 | ```yaml 4 | type: VideoExercise 5 | lang: r 6 | xp: 50 7 | video_link: //player.vimeo.com/video/160339466 8 | video_hls: //videos.datacamp.com/transcoded/672_intermediate_r/v2/hls-ch1_1.master.m3u8 9 | ``` 10 | -------------------------------------------------------------------------------- /docs/projects/media/topics.csv: -------------------------------------------------------------------------------- 1 | id,name 2 | 1,R Programming 3 | 2,Python Programming 4 | 3,Data Manipulation 5 | 4,Data Visualization 6 | 5,Reporting 7 | 6,Machine Learning 8 | 7,Probability & Statistics 9 | 8,Importing & Cleaning Data 10 | 9,Applied Finance 11 | 10,Programming 12 | 11,Other 13 | 12,Case Studies 14 | -------------------------------------------------------------------------------- /book.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Authoring Content for DataCamp", 3 | "plugins": [ 4 | "bootstrap-callout", 5 | "expandable-chapters", 6 | "advanced-emoji", 7 | "videoclips", 8 | "copy-code-button", 9 | "codetabs" 10 | ], 11 | "pluginsConfig": {}, 12 | "pdf": { 13 | "fontFamily": "Lato" 14 | }, 15 | "root": "docs/" 16 | } 17 | -------------------------------------------------------------------------------- /docs/courses/exercises/all-exercise-types/README.md: -------------------------------------------------------------------------------- 1 | # All Exercise Types 2 | 3 | This section discusses how to author parts of exercises that are common to all exercise types. 4 | 5 | In particular, it covers: 6 | 7 | - [Learning objective](./learning-objective.md) 8 | - [Title](./title.md) 9 | - [Hints](./hints.md) 10 | - [Success Message](./success-message.md) 11 | -------------------------------------------------------------------------------- /docs/mobile/README.md: -------------------------------------------------------------------------------- 1 | # DataCamp for Mobile 2 | 3 | DataCamp for Mobile allows students to engage with their data science learning 4 | content anytime, anywhere (even [on the 5 | toilet](https://www.datacamp.com/community/blog/mobile-data-science)). 6 | 7 | There are two types of mobile content: [courses](/mobile/courses/README.md) and 8 | [practice](/mobile/practice/README.md). 9 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "authoring", 3 | "scripts": { 4 | }, 5 | "env": { 6 | }, 7 | "formation": { 8 | "web": { 9 | "quantity": 1 10 | } 11 | }, 12 | "addons": [ 13 | 14 | ], 15 | "buildpacks": [ 16 | { 17 | "url": "https://github.com/datacamp/heroku-buildpack-nodejs" 18 | }, 19 | { 20 | "url": "https://github.com/heroku/heroku-buildpack-static" 21 | } 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /docs/courses/exercises/examples/md/shell/ConsoleExercise.md: -------------------------------------------------------------------------------- 1 | ## Example of ConsoleExercise 2 | 3 | ```yaml 4 | type: ConsoleExercise 5 | xp: 100 6 | ``` 7 | 8 | `@instructions` 9 | 10 | - Create a new directory, called `test`. 11 | 12 | `@hint` 13 | 14 | - You need to use `mkdir`. 15 | 16 | `@solution` 17 | 18 | ```{bash} 19 | mkdir test 20 | ``` 21 | 22 | `@sct` 23 | 24 | ```{python} 25 | Ex().success_msg("Great!") 26 | ``` 27 | -------------------------------------------------------------------------------- /docs/challenges/content/examples/r/MultipleChoiceChallenge2.md: -------------------------------------------------------------------------------- 1 | ## Identify Categorical Variables 2 | 3 | ```yaml 4 | type: MultipleChoiceChallenge 5 | difficulty: 1 6 | ``` 7 | 8 | `@assignment` 9 | 10 | Which of the following is NOT a categorical variable? 11 | 12 | `@options` 13 | 14 | - [Weight] 15 | - [Height] 16 | - [Temparature] 17 | - [Distance] 18 | - "Blood Type" 19 | - Gender 20 | - Season 21 | - Weekday 22 | - Month 23 | 24 | -------------------------------------------------------------------------------- /docs/courses/design/examples/README.md: -------------------------------------------------------------------------------- 1 | # Course Design Examples 2 | 3 | To help you understand what this design process is supposed to produce, 4 | we have included some examples of well-written courses specs: 5 | 6 | - [Dimensionality Reduction](./dimensionality-reduction.md) by Alyssa Batula 7 | - [Image Segmentation with Python](./image-segmentation.md) by Veronika Cheplygina 8 | - [Stochastic Processes in R](./stochastic-processes.md) by Dave Robinson 9 | -------------------------------------------------------------------------------- /docs/courses/exercises/examples/md/nolang/PureMultipleChoiceExercise.md: -------------------------------------------------------------------------------- 1 | ## Here's a question for you 2 | 3 | ```yaml 4 | type: PureMultipleChoiceExercise 5 | xp: 50 6 | ``` 7 | 8 | This is some context 9 | 10 | `@question` 11 | 12 | Which option do you prefer? 13 | 14 | `@hint` 15 | 16 | there is a hint 17 | 18 | `@possible_answers` 19 | 20 | - option 1 21 | - option 2 22 | - option 3 23 | - [the right option] 24 | 25 | `@feedbacks` 26 | 27 | - wrong 28 | - oups 29 | - wrong 30 | - nice! 31 | -------------------------------------------------------------------------------- /docs/courses/exercises/technical-details/sct.md: -------------------------------------------------------------------------------- 1 | ## Submission Correctness Tests 2 | 3 | Please visit the articles on Intercom: 4 | 5 | - [Introduction to Submission Correctness Tests](https://intercom.help/datacamp-teach/courses/submission-correctness-tests) 6 | - [Submission Correctness Tests: Deep Dive](https://intercom.help/datacamp-teach/courses/submission-correctness-tests-deep-dive) 7 | - [Submission Correctness Tests: Best Practices](https://intercom.help/datacamp-teach/courses/submission-correctness-tests-best-practices) -------------------------------------------------------------------------------- /docs/courses/spreadsheets/limitations.md: -------------------------------------------------------------------------------- 1 | ## Limitations 2 | 3 | Limitations currently include: 4 | 5 | * Some things are not preserved over exercises and need to be in the Golden Copy. For example: 6 | * Conditional formatting 7 | * Merged cells 8 | * Dropdown menus in cells 9 | * Named Ranges are not preserved (even over the Golden Copy), so should be avoided. 10 | * Tweaks might have to be made to `check_chart` or `check_pivot`. Make sure to add what you 11 | need to the Tech Blockers issue of your course. 12 | -------------------------------------------------------------------------------- /docs/courses/guidelines/README.md: -------------------------------------------------------------------------------- 1 | ## Guidelines 2 | 3 | We want DataCamp content to have as consistent a style and experience as possible. 4 | The articles in these sections list out how you should write your content, 5 | what writing style you should adopt, 6 | and when to choose for certain types of exercises. 7 | We have also included two worked-out exercises, 8 | [one in R](exercise-critique-r.md) 9 | and [one in Python](exercise-critique-python.md), 10 | along with the feedback our Content Developers would give on them. 11 | -------------------------------------------------------------------------------- /docs/courses/spreadsheets/other_exercises.md: -------------------------------------------------------------------------------- 1 | # Other Exercises 2 | 3 | Until now we talked about regular exercises. These have the type `NormalExercise` internally, 4 | but you don't have to define this as it's the default. The type of an exercise can be controlled 5 | in the meta sheet, using the `type` field. There are 3 other types: 6 | 7 | * [`VideoExercise`](other_exercises/video.md) 8 | * [`PureMultipleChoiceExercise`](other_exercises/pure-multiple-choice.md) 9 | * [`MultipleChoiceExercise`](other_exercises/multiple-choice.md) 10 | -------------------------------------------------------------------------------- /docs/challenges/README.md: -------------------------------------------------------------------------------- 1 | # Challenges 2 | 3 | Coding up challenges is pretty similar to coding up a course. This time, however, there is no course-chapter-exercise concept. Instead, challenges are simply grouped in pools. All challenges have to specified as markdown files in the `challenges/` folder. You can choose the names of the markdown files, the number of challenges per file, and how to structure the challenges. 4 | 5 | > #### info::Note 6 | > _Challenges are going to be available soon, meanwhile you can continue reading the [data structure](/challenges/repo-structure.md) documentation_ -------------------------------------------------------------------------------- /docs/courses/exercises/technical-details/README.md: -------------------------------------------------------------------------------- 1 | # Technical details 2 | 3 | This section explores some of the more technical details of exercises types. They are provided for reference, but knowing about them is not usually necessary as a course instructor. 4 | 5 | Topics include: 6 | 7 | - Writing [Solution Correctness Tests](sct.md), to ensure that the student has the right answer. 8 | - How [Experience Points](xp.md) work. 9 | - What's in the [exercise YAML headers](exercise-headers.md). 10 | - What [blocks](exercise-blocks.md) each exercise has. 11 | - Details of the custom [markdown authoring format](unified-authoring-api.md). 12 | -------------------------------------------------------------------------------- /docs/courses/spreadsheets/exercises/content-guidelines.md: -------------------------------------------------------------------------------- 1 | ## Content guidelines 2 | 3 | When writing exercises, a few criteria are checked in your meta sheets. These criteria will help you 4 | write exercises that follow the DataCamp content guidelines. If you violate the guidelines, the 5 | correspending fields will be highlighted in red. Your chapter will still build, but know that you'll 6 | have to come back and fix this exercise. 7 | 8 | ![Content guideline violation](images/content_guidelines.png) 9 | 10 | The [guidelines for courses](../../guidelines/content.md) apply to spreadsheets courses to, so make 11 | sure to go through them. 12 | -------------------------------------------------------------------------------- /docs/courses/spreadsheets/other_exercises/multiple-choice.md: -------------------------------------------------------------------------------- 1 | # Multiple Choice Exercises 2 | 3 | For the multiple choice exercise, add a [meta sheet](../exercises/meta.md) and add the 4 | field `type` with value `MultipleChoiceExercise`. 5 | 6 | A multiple choice exercise works exactly the same as a 7 | [`PureMultipleChoiceExercise`](pure-multiple-choice.md), except for the fact that the 8 | user will also get a workbook to experiment in. The meta sheet is exactly the same 9 | as for a pure multiple choice exercise. However, for this exercise type you can also 10 | add a solution and sample sheet. You can **not** define an SCT sheet for this exercise 11 | type. 12 | -------------------------------------------------------------------------------- /docs/courses/exercises/examples/md/r/RStudioMultipleChoiceExercise.md: -------------------------------------------------------------------------------- 1 | ## Let's use the viewer pane! 2 | 3 | ```yaml 4 | type: RStudioMultipleChoiceExercise 5 | xp: 50 6 | ``` 7 | 8 | The viewer pane is similar to the plots pane, but it displays HTML output. 9 | 10 | True or false? 11 | 12 | `@instructions` 13 | 14 | - True 15 | - False 16 | 17 | `@hint` 18 | 19 | Remember, you can view interactive output within the viewer tab. 20 | 21 | `@pre_exercise_code` 22 | 23 | ```{r eval = FALSE} 24 | # no pec 25 | ``` 26 | 27 | `@sct` 28 | 29 | ```{r eval = FALSE} 30 | msg1 <- "Correct!" 31 | msg2 <- "Incorrect, rewatch the video and see what Garrett says about the viewer pane." 32 | 33 | ex() %>% check_mc(1, feedback_msgs = c(msg1, msg2)) 34 | ``` 35 | -------------------------------------------------------------------------------- /docs/courses/spreadsheets/exercises/sample.md: -------------------------------------------------------------------------------- 1 | # Sample 2 | 3 | ``` 4 | Exercise - Sample 5 | ``` 6 | 7 | This is the sheet where you put the sample data of the exercise. This is the first content a user 8 | will see in the sheet. It should contain all spreadsheet data that is needed for the user to get 9 | started. This might look something like this: 10 | 11 |
12 | 13 | 17 | 18 |
19 | 20 | The same [remarks we made about solution data](./solution.md) apply here, meaning the sample data 21 | sheet only records differences in values, formulas and number format. 22 | -------------------------------------------------------------------------------- /docs/projects/projects-good-project.md: -------------------------------------------------------------------------------- 1 | What makes a good Project? 2 | ================================== 3 | 4 | WIP. 5 | 6 | 7 | 19 | - The [Project Notebook Format](projects-format.md) page describes how the Jupyter notebook for Projects, which is the authoring tool for DataCamp Projects, is structured. 20 | - The [Project File Structure](projects-repo-structure.md) page describes the file structure of the private GitHub repository where all of the contents of the Projects are stored. This repository can only be viewed by DataCamp and the Project's instructor(s). 21 | -------------------------------------------------------------------------------- /docs/courses/README.md: -------------------------------------------------------------------------------- 1 | # Courses 2 | 3 | A course consists of series of videos, slides, and different types of exercises. A typical premium course combines brief video lectures with hands-on coding exercises. 4 | 5 | ## Creating a Course 6 | 7 | To create a course make sure you are signed in to your [DataCamp](https://www.datacamp.com) account. 8 | Once you are signed in, go to [DataCamp for Teachers](https://www.datacamp.com/teach). 9 | 10 | ![DataCamp for Teachers - Dashboard](/images/courses/teach-dashboard.png) 11 | _[DataCamp for Teachers - Dashboard](/interface/dashboard.md)_ 12 | 13 | To create a new course, click the "Add Course +" button. The following dialog will appear: 14 | 15 | ![DataCamp for Teachers - Dashboard](/images/courses/teach-dashboard-add-course.png) 16 | _DataCamp for Teachers - Create Course dialog_ 17 | 18 | Give your course a `name` and specify the technology it will use (one of R, Python, SQL, or Shell). Names must be all lower-case with dashes instead of spaces, such as `best-course`. When you are done, click "Create". 19 | 20 | > #### info::NOTE 21 | > Creating the course can take a few moments. 22 | 23 | Once the course has been created it will appear in your Dashboard: 24 | 25 | ![DataCamp for Teachers - Dashboard](/images/courses/teach-dashboard-course-list.png) 26 | _DataCamp for Teachers - Course dashboard_ 27 | 28 | Congratulations–you just created your first course! 29 | 30 | ### What Just Happened? 31 | 32 | Here's what happened behind the scenes when you clicked "Create": 33 | 34 | 1. DataCamp created a course populated with scaffolded exercises and information. 35 | 2. The course was uploaded to your Github account in a new repository named `best-course`. 36 | (You can check this by going to your account on GitHub and looking for that repository.) 37 | 38 | You can now learn about: 39 | 40 | - [Course repository structure](repo-structure.md) 41 | - [Exercises](exercises/README.md) 42 | - [Slides](exercises/video-exercises/creating-slides.md) 43 | - [Assets](assets.md) 44 | - [Experience Points](exercises/technical-details/xp.md) 45 | - [Course Design](design/README.md) 46 | - [Learner Personas](design/personas.md) 47 | - [Course Design Template](design/template.md) 48 | -------------------------------------------------------------------------------- /docs/courses/design/brainstorming-mistakes.md: -------------------------------------------------------------------------------- 1 | # Step 1.6 - What mistakes or misconceptions do you expect? 2 | 3 | Write a list of common mistakes that you think students will make. These can be programming mistakes, conceptual misunderstandings, or simply examples of things that are unintuitive. 4 | 5 | 6 | ## Examples 7 | 8 | From a course on generalized additive models: 9 | 10 | - The difference between prediction intervals and confidence intervals. 11 | 12 | From a course on business process mining: 13 | 14 | - The structure of "process data" might be confusing to students new to the field, especially the distinction between events and activities. 15 | 16 | From a course on tree-based models: 17 | 18 | - Not knowing which are the best hyperparameters to optimize for the different tree-based models. 19 | 20 | ## FAQs 21 | 22 | ### What types of mistakes do the students make? 23 | 24 | There are several areas in which things can go wrong. The most obvious type of mistake is a coding error (since the student will get the answer wrong when they complete a coding exercise). More serious but harder to detect problems are failures to understand concepts, and misunderstandings about the meaning of jargon. 25 | 26 | 27 | ## Good ideas 28 | 29 | ### Categorize your responses 30 | 31 | In order to think of things that can go wrong, it can be easier to narrow it down and deal with specific topics. What are the potential programming problems? What are the statistical problems? What domain-specific knowledge is hard to learn? Which bits or jargon will be unclear? 32 | 33 | ## Common problems and their solutions 34 | 35 | ### I can't think of anything 36 | 37 | - To give you inspiration, take a look at [The R Inferno](http://www.burns-stat.com/pages/Tutor/R_inferno.pdf), a classic (by programming standards) text on things that can go wrong when learning R. 38 | - Try explaining a concept or definition from the course out loud to someone with no data science background. Note the point at which they begin to look confused or their eyes glaze over. 39 | 40 | ## How will this be reviewed? 41 | 42 | Your Curriculum Lead will discuss your responses to the brainstorming questions. They will not be formally reviewed (though they provide important context for reviewers). 43 | -------------------------------------------------------------------------------- /docs/courses/exercises/examples/md/r/MultipleChoiceExercise.md: -------------------------------------------------------------------------------- 1 | ## Function scoping 2 | 3 | ```yaml 4 | type: MultipleChoiceExercise 5 | lang: r 6 | xp: 50 7 | ``` 8 | 9 | An issue that Filip did not discuss in the video is function scoping. It implies that variables that are defined inside a function are not accessible outside that function. Try running the following code and see if you understand the results: 10 | 11 | ``` 12 | pow_two <- function(x) { 13 | y <- x ^ 2 14 | return(y) 15 | } 16 | pow_two(4) 17 | y 18 | x 19 | ``` 20 | 21 | `y` was defined inside the `pow_two()` function and therefore it is not accessible outside of that function. This is also true for the function's arguments of course - `x` in this case. 22 | 23 | Which statement is correct about the following chunk of code? The function `two_dice()` is already available in the workspace. 24 | 25 | ``` 26 | two_dice <- function() { 27 | possibilities <- 1:6 28 | dice1 <- sample(possibilities, size = 1) 29 | dice2 <- sample(possibilities, size = 1) 30 | dice1 + dice2 31 | } 32 | ``` 33 | 34 | `@instructions` 35 | 36 | - Executing `two_dice()` causes an error. 37 | - Executing `res <- two_dice()` makes the contents of `dice1` and `dice2` available outside the function. 38 | - Whatever the way of calling the `two_dice()` function, R won't have access to `dice1` and `dice2` outside the function. 39 | 40 | `@hint` 41 | 42 | - The function `two_dice()` doesn't take any input. Calling it with an argument will generate an error. 43 | 44 | `@pre_exercise_code` 45 | 46 | ```{r} 47 | two_dice <- function() { 48 | possibilities <- 1:6 49 | dice1 <- sample(possibilities, size = 1) 50 | dice2 <- sample(possibilities, size = 1) 51 | dice1 + dice2 52 | } 53 | ``` 54 | 55 | `@sct` 56 | 57 | ```{r} 58 | msg1 <- "Calling `two_dice()` doesn't throw an error; feel free to try it out in the console. Try again." 59 | msg2 <- "Assigning the result of a function to a variable does not change anything about the scoping of the variables inside that function. Have another go at it." 60 | msg3 <- "Great! If you're familiar with other programming languages, you might wonder whether R passes arguments by value or by reference. Find out in the next exercise!" 61 | ex() %>% check_mc(3, feedback_msgs = c(msg1, msg2, msg3)) 62 | ``` 63 | -------------------------------------------------------------------------------- /docs/courses/exercises/video-exercises/slides.md: -------------------------------------------------------------------------------- 1 | # Writing `VideoExercise` Slides 2 | 3 | This page provides guidance on writing good video slides. 4 | 5 | ## Examples 6 | 7 | From [What is code profiling](https://campus.datacamp.com/courses/writing-efficient-r-code/diagnosing-problems-code-profiling?ex=1) in "Writing Efficient R Code". As well as having the instructor dressed up to match the dataset being discussed, this also makes good use of images and screenshots. 8 | 9 | From [Embrace, Extend, Override](https://campus.datacamp.com/courses/object-oriented-programming-in-r-s3-and-r6/r6-inheritance?ex=5) in "Object-Oriented Programming in R:S3 & R6". This makes use of a physical prop in order to demonstrate the concept. It also includes a summary slide at the end. 10 | 11 | 12 | ## FAQs 13 | 14 | ### How many slides should I have? 15 | 16 | Too few slides can be boring; too many can be overwhelming. A reasonable heuristic is to have "one slide per idea". That is, anytime you introduce a new idea in words, you also change what is onscreen. 17 | 18 | 19 | ## Good ideas 20 | 21 | ### Use images 22 | 23 | Whether they are pictures, plots, or diagrams, having images in your videos helps students learn, and makes the course adverts more photogenic, which helps to increase the number of students starting your course. 24 | 25 | ### Use dual coding 26 | 27 | When words and visuals match ("dual coding"), it can increase learning relative to a single communication channel. 28 | 29 | ### Include a summary slide 30 | 31 | It can be hard to remember everything that is spoken in a video. Having a summary slide can help students to be aware of what they just learned. 32 | 33 | 34 | ## Common problems and their solutions 35 | 36 | ### Too much information 37 | 38 | Videos need to be understandable in real-time, so err on the side of simplifying things and omitting things. 39 | 40 | ### Speech and slide mismatches 41 | 42 | While complementary speech and slides provide a boost to learning (see "Use dual coding" point), having mismatched speech and slides detracts from learning, since the student has to decifer which to the two media is the one to pay attention to. 43 | 44 | ### Using "meme" images 45 | 46 | These often get dated incredibly quickly, and detract from the premium feel of the content. 47 | -------------------------------------------------------------------------------- /docs/interface/dashboard.md: -------------------------------------------------------------------------------- 1 | # Course dashboard 2 | 3 | ![Teach dashboard](/images/courses/teach-dashboard.png) 4 | *Teach dashboard* 5 | 6 | The landing page consists of two parts: a sortable, filterable and paginated table of course repositories and a modal to create new courses. The table has the following columns: 7 | 8 | - **Title**: the title of the course (or repository name if it is not properly built yet) 9 | - **Owner**: the owner of the repository. If the repository has no owner yet, you can claim it if it's yours. 10 | - **Instructors**: instructors of the repository. You can set these in the Settings tab of the master branch of the repository. 11 | - **Updated by me**: when the repository was last updated by me 12 | - **Updated by instructor**: when the repository was last updated by an instructor 13 | - **Un reviewed time**: the time differences between when the repository was last updated by me and when it was last updated by an instructor 14 | - **Last updated branch**: the branch of this repository that was last updated 15 | 16 | For featured courses the following extra columns are in the table: 17 | 18 | - **Completion rate**: the percentage of course takers that completed the course 19 | - **Rating**: the user rating of the course 20 | - **Hint rate**: the percentage of students that take a hint, averaged over each exercise of the course 21 | - **Solution rate**: the percentage of students that take a solution, averaged over each exercise of the course 22 | 23 | The following features are also important in the course dashboard: 24 | 25 | - The **search field** will do string matching in the following columns: title, owner, instructors and last updated branch. 26 | - Checking the **"Only my courses"** checkbox will show you only courses that are owned by you. 27 | ***Note**: the first time using the dashboard, no courses will be owned by you.* 28 | - In the upper right corner of the dashboard, you can choose between Featured/Development courses. Featured courses are courses that are in production on DataCamp. 29 | - You can synchronize the shown repositories with GitHub by hitting the **"Refresh List"** link in the upper right corner of the dashboard. 30 | - The table is paginated, which means the rows are shown per 10. You can show all the repositories, but this can be slow if there are a lot of repositories. -------------------------------------------------------------------------------- /docs/mobile/courses/exercises/reorder.md: -------------------------------------------------------------------------------- 1 | # Reorder Exercises 2 | 3 | A reorder exercise presents the student with randomly shuffled lines of code 4 | that need to be dragged into the correct sequence in order to produce the given 5 | output. Reorder exercises do **not** require distractors. 6 | 7 | By default every individual line is reorderable: 8 | 9 | ```yaml 10 | # data.frame() 11 | - key: # generate me! 12 | context: "You can create a data frame with the `data.frame` function." 13 | code: 14 | - |- 15 | df <- data.frame(a = 1:100, b = 101:200) 16 | df <- subset(df, b > 170) 17 | df <- df[1:2, ] 18 | df 19 | output: |-4 20 | a b 21 | 71 71 171 22 | 72 72 172 23 | ``` 24 | 25 | ![Reorder exercise with one solution](/images/mobile/reorder-one-solution-small.png) 26 | 27 | If there are multiple possible solutions, you can specify them all in a list. 28 | 29 | ```yaml 30 | # comments 31 | - key: # generate me! 32 | context: "Anything that comes after the `#` character is a comment and is not interpreted as code." 33 | code: 34 | - |- 35 | # this is a comment 36 | x <- 400 37 | x 38 | - |- 39 | x <- 400 40 | # this is a comment 41 | x 42 | - |- 43 | x <- 400 44 | x 45 | # this is a comment 46 | output: "[1] 400" 47 | 48 | ``` 49 | 50 | ![Reorder exercise with multiple solutions](/images/mobile/reorder-multi-solutions-small.png) 51 | 52 | If you'd like the student to reorder blocks of code that are longer than 1 line, 53 | you can use 4 dash `-` symbols to mark the blocks. 54 | 55 | ```yaml 56 | # while loop 57 | - key: # generate me! 58 | context: "" 59 | code: 60 | - |- 61 | offset = -2 62 | ---- 63 | while offset != 0: 64 | ---- 65 | if offset > 0: 66 | offset = offset - 1 67 | ---- 68 | else: 69 | offset = offset + 1 70 | ---- 71 | print(offset) 72 | output: |- 73 | -1 74 | 0 75 | ``` 76 | 77 | ![Reorder exercise with multi-line blocks](/images/mobile/reorder-multi-line-small.png) 78 | 79 | | Guideline | Min | Reco Min | Reco Max | Max | 80 | | :-------- | :-- | :------- | :------- | :-- | 81 | | Number of reorder blocks | 3 | 3 | 5 | 6 | 82 | | Lines of code in a Reorder block | 1 | 1 | 2 | 3 | 83 | -------------------------------------------------------------------------------- /docs/projects/old/projects-usp.md: -------------------------------------------------------------------------------- 1 | # USP of DataCamp Projects 2 | 3 | This section lays out some thoughts on what I believe is the USP of DataCamp Projects, that makes it superior to our competition. 4 | 5 | __Clean separation of narrative from pedagogy__ 6 | 7 | A lot of projects mix the narrative and the pedagogy in the notebook. At DataCamp, we recognize that the narrative is a storyline that students want to share, and so we keep it pristine, and devoid of any instructional or pedagogical elements. All pedagogical elements that support the project are available in the sidebar. We believe that this design maximizes the utility a student can derive from the project. 8 | 9 | __Supervised, yet flexible coding environment__ 10 | 11 | Competing platforms usually provide either a fully supervised learning environment, where a coding task needs to be completed exactly to specifications, leaving little flexibility for the end user (Coursera, Udacity), or a totally flexible environment, where they can write code in a totally flexible way. The advantage of a supervised learning environments is that it is easy to write tests, but the tests are usually very stringent, making it imperative to provide ample code scaffolding, thereby sacrificing flexibility. 12 | 13 | Our implementation of projects works around this in a few ways: 14 | 15 | 1 | While the narrative describes the high-level objectives of the task, the instructions provide a lot of detail into what is expected from the user. The instructions focus on what are the required elements of the output, and also shares output snippets, making it very clear what is to be expected. As the instructions focus on what needs to be done, rather than how it needs to be done, it provides the user with a lot of flexibility in terms of writing code. 16 | 17 | ![](projects/media/image10.png) 18 | 19 | 2 | The **tests** are written only to test certain properties of the user output that are made amply clear in the instructions. This lets the user write code in a very flexible way, while still being able to address the requirements of the task, based on the output requirements that are made explicit in the **instructions**. 20 | 21 | 3 | Sometimes, it is hard to complete a task successfully. The only way to proceed in such cases, usually, is to take a peek at the final solution. Our implementation supports hints, that are aimed as an intermediate step to nudge the user to the final solution, without having to take a look at the fully completed solution. 22 | -------------------------------------------------------------------------------- /docs/courses/exercises/technical-details/exercise-headers.md: -------------------------------------------------------------------------------- 1 | # Exercise Headers 2 | 3 | Each exercise has a header consisting of a `title` block and a YAML properties defining the exercise: 4 | 5 | {% codetabs name="Video", type="py" -%} 6 | ## Video Exercise 7 | 8 | ```yaml 9 | type: VideoExercise 10 | lang: r 11 | xp: 50 12 | video_link: //player.vimeo.com/video/160339466 13 | video_hls: //videos.datacamp.com/transcoded/672_intermediate_r/v2/hls-ch1_1.master.m3u8 14 | ``` 15 | {%- language name="Normal", type="py" -%} 16 | ## Interactive Exercise Title 17 | 18 | ```yaml 19 | type: NormalExercise 20 | lang: r 21 | xp: 100 22 | ``` 23 | {%- language name="MultipleChoice", type="py" -%} 24 | ## When to use Python? 25 | 26 | ```yaml 27 | type: MultipleChoiceExercise 28 | lang: python 29 | xp: 50 30 | ``` 31 | {%- language name="PureMultipleChoice", type="py" -%} 32 | ## Example of PureMultipleChoiceExercise 33 | 34 | ```yaml 35 | type: PureMultipleChoiceExercise 36 | lang: python 37 | xp: 50 38 | ``` 39 | {%- endcodetabs %} 40 | 41 | ## Exercise Properties {#exercise-properties} 42 | 43 | The supported properties differ depending on the type of the exercise: 44 | 45 | | Block | Video | Normal | MultipleChoice | PureMultipleChoice | 46 | |----------------|-------------------:|-------------------:|-------------------:|--------------------:| 47 | | `type` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | 48 | | `key` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | 49 | | `lang` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | 50 | | `xp` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | 51 | | `video_link` | :white_check_mark: | :x: | :x: | :x: | 52 | | `aspect_ratio` | :white_check_mark: | :x: | :x: | :x: | 53 | 54 | - `type`: type of the exercise you are creating as listed in [Exercise Types](README.md#exercise-types). 55 | - `key`: a unique key for the exercise generated by DataCamp. Do not modify or duplicate this key. 56 | - `lang`: the language of the exercise (`r`, `python`, `sql`, or `shell`). 57 | - `xp`: the XP the student will receive for solving the exercise. 58 | - `video_link`: a link to the video for a `VideoExercise`. 59 | - `aspect_ratio`: the aspect ration for a `VideoExercise`. 60 | -------------------------------------------------------------------------------- /docs/mobile/courses/exercises/tap.md: -------------------------------------------------------------------------------- 1 | # Tap 2 | 3 | Tap exercises are similar to a [Select 4 | Code](/mobile/courses/exercises/select-code.md) exercise, in that student's are 5 | asked to produce the code that generates a given output. In a Tap exercise, 6 | however, the framework for the code block is provided with 1 or more blanks, and 7 | students only need to fill in the blanks from a set of possibilities. 8 | 9 | In order to specify the location of blanks, Tap exercises require a special 10 | `code` block - it must include at least one `??` placeholder. Each `??` 11 | corresponds to the location of a fill-in-the-blank in the rendered exercise. 12 | 13 | They also require a special additional field `blanks`. The `blanks` field 14 | specifies the correct sequence of blanks (in the correct order), while the 15 | `distractor_blanks` field specifies the additional distractor items that will be 16 | available. 17 | 18 | The default `question` block for a Tap exercise is `Complete the code to 19 | generate the output`. 20 | 21 | ```yaml 22 | # print() 23 | - key: # generate me! 24 | context: "You can use the `print` function to display things in the console." 25 | code: |- 26 | x = 17 27 | ??(x) 28 | output: "17" 29 | blanks: 30 | - "print" 31 | distractor_blanks: 32 | - option: "show" 33 | feedback: "" 34 | - option: "console.log" 35 | feedback: "That's how it works in JavaScript, not Python." 36 | ``` 37 | 38 | ![Tap exercise with one blank](/images/mobile/tap-one-blank-small.png) 39 | 40 | If there is more than one blank, customized feedback for individual distractors 41 | is not supported. You can (and should!) still use a fallback `feedback_wrong` 42 | field, however. 43 | 44 | ```yaml 45 | # print() 46 | - key: # generate me! 47 | context: "You can use the `print` function to display things in the console." 48 | code: |- 49 | x = 17 50 | ??(x + ??) 51 | output: "18" 52 | blanks: 53 | - "print" 54 | - "1" 55 | distractor_blanks: 56 | - "show" 57 | - "console.log" 58 | - "2" 59 | feedback_wrong: "We want to `print` the results of an expression that adds up to `18`." 60 | ``` 61 | 62 | ![Tap exercise with multiple blanks](/images/mobile/tap-multi-blank-small.png) 63 | 64 | | Guideline | Min | Reco Min | Reco Max | Max | 65 | | :-------- | :-- | :------- | :------- | :-- | 66 | | Options in a Tap | 1 | 2 | 4 | 6 | 67 | | Characters in a Tap option | 1 | 1 | 15 | 20 | 68 | -------------------------------------------------------------------------------- /docs/mobile/courses/exercises/multiple-choice.md: -------------------------------------------------------------------------------- 1 | # Multiple Choice Exercises 2 | 3 | The student has to choose one or more correct answers. This is the only exercise 4 | type that doesn't have a default `question` field - you have to ask the student 5 | a particular question! You *can* use `code`, `output`, or `table` blocks if they 6 | are useful, but they aren't required. 7 | 8 | The `text` field contains the correct answers, and `distractor_text` contains 9 | the incorrect answers. For a single correct answer, `text` can be a string. In 10 | this case, the student is only permitted to select one option. 11 | 12 | ```yaml 13 | # lambda functions 14 | - key: # generate me! 15 | context: "Lambda is useful for creating anonymous functions! 😏" 16 | question: "Which of the following are correct?" 17 | text: "Lambda functions do not contain a return statement" 18 | distractor_text: 19 | - option: "Lambda is not useful for creating anonymous functions" 20 | feedback: "Shame on you!" # Don't actually shame students 21 | - option: "Lambda functions contain a return statement" 22 | feedback: "Lambda functions contain an expression which is returned!" 23 | ``` 24 | 25 | ![Multiple Choice exercise with one option](/images/mobile/multi-choice-one-option-small.png) 26 | 27 | For multiple correct answers, text can be an array of strings. In this case, the 28 | student will be allowed to select multiple options, and the exercise will be 29 | considered incorrect unless the student selects *all* the correct answers. 30 | 31 | ```yaml 32 | # lambda functions 33 | - key: # generate me! 34 | context: "Lambda is useful for creating anonymous functions! 😏" 35 | question: "Which of the following are correct?" 36 | text: 37 | - "Lambda is useful for creating anonymous functions" 38 | - "Lambda functions do not contain a return statement" 39 | distractor_text: 40 | - option: "Lambda is not useful for creating anonymous functions" 41 | feedback: "Shame on you!" # Don't actually shame students 42 | - option: "Lambda functions contain a return statement" 43 | feedback: "Lambda functions contain an expression which is returned!" 44 | ``` 45 | 46 | ![Multiple Choice exercise with multiple option](/images/mobile/multi-choice-multi-option-small.png) 47 | 48 | | Guideline | Min | Reco Min | Reco Max | Max | 49 | | :-------- | :-- | :------- | :------- | :-- | 50 | | Characters in a multiple choice option | 1 | 1 | 30 | 60 | 51 | -------------------------------------------------------------------------------- /docs/faq/README.md: -------------------------------------------------------------------------------- 1 | # Frequently Asked Questions 2 | 3 | ## DataCamp commits to my repository on my behalf, why? 4 | 5 | Before you can create a course, you have to log in to DataCamp, and link your account to GitHub. From that moment on, DataCamp is able to make changes to the repositories you've linked on your behalf. For example, when you create a new course with the "Create a DataCamp Course" dialog, we will create a repository for you, and pre-fill it with course and chapter files with several commits. That way, the build process for your course is automatically triggered and a DataCamp course results. 6 | 7 | Another point where DataCamp does commits on your behalf, is for setting 'exercise keys'. These keys are meant to make the link between your exercises in the GitHub repository and the exercises on DataCamp's databases. 8 | 9 | ## Is GitHub necessary to teach on DataCamp? Can we use our own tools? 10 | 11 | We are currently depending heavily on GitHub, but we're exploring other possibilities for private and proprietary content. More specifically, we're looking at GitLab to host our own premium courses. During development, we may also explore ways to allowing other GitLab instances to connect to DataCamp. 12 | 13 | ## How are courses hosted? Is it possible to have courses only available to a select group of people? 14 | 15 | Courses are always hosted on datacamp.com. There are different states for a course: development and published. Development courses are only available to those who have the link to the course. Published courses are available through a human-readable slug (www.datacamp.com/courses/my-awesome-course), but not findable by Google. Currently, we do not have a system in place to grant access to a particular number of people; it's just the people with the link that have access. 16 | 17 | ## I added a dataset to my datasets folder on git, why isn't it uploading? 18 | 19 | Datasets or slides have a maximum size of 10 Megabytes. Bigger datasets won't be uploaded and thus will not generate a link. The build logs will tell you your dataset is too big. We need this security built in because we don't want anyone to upload massive datasets onto our servers. 20 | 21 | ## I need a package but it's not installed on your servers, what can I do? 22 | 23 | At the moment a lot of packages that can be used for Data Science are installed on our servers. There's no easy way to install packages yourself, however if you come across a package you think should really be installed, you can mail `content-engineering@datacamp.com`. Please note that there is no guarantee that we will install the package. 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/courses/design/brainstorming-jargon.md: -------------------------------------------------------------------------------- 1 | # Step 1.4 - What terms or jargon will you define? 2 | 3 | Write a list of technical terms, jargon, and acronyms that will be used in the course. 4 | 5 | 6 | ## Examples 7 | 8 | From a course on experimental design. This has an extensive list of statistical terms. 9 | 10 | - Randomization, replication, blocking, Latin Square, Greco-Latin Squares, factorial, ANOVA, T-test, F-test, normality, qqplot, variance, type I/II error, null/alternative hypothesis, effect size, factor/categorical variable 11 | 12 | From a course on clinical trials analysis. This includes both statistical terms and domain-specific terms. 13 | 14 | - Bias, blinding, randomization, imbalance, covariates, endpoints, power, multiplicity, significance, non-inferiority, equivalence, bioequivalence. 15 | 16 | From a course on data privacy. This in an extensive list of both statistical terms and privacy-related terms. 17 | 18 | - Statistical Disclosure Limitation, Data Synthesis, K-Anonymity, Neighboring Databases, Randomized Response, Differential Privacy, Composition Rules, Group Privacy, Post-processing, Global Sensitivity, Histogram queries, Laplace Mechanism, Exponential Mechanism, Differential Privacy Data Synthesis 19 | 20 | ## FAQs 21 | 22 | ### What can I assume that the students will know already? 23 | 24 | This depends a lot upon the prerequisites for the course. For example, the introductory statistical courses have to explain what a statistical model is. For most statistical courses, you don't need to do that since they will have one of those courses are as prerequisite. 25 | 26 | 27 | ## Good ideas 28 | 29 | ### Think of synonyms 30 | 31 | Often there are several different words for a particular concept. For example, columns in a rectangular dataset may also be referred to as fields or features or variables, depending upon context. Many students may have head one term but not the others, so it can be useful to explain synonyms to them. (Though note that once you've explained the synonyms, you should be consistent about which term you are using.) 32 | 33 | 34 | ## Common problems and their solutions 35 | 36 | ### I can't think of anything 37 | 38 | Split the problem up into different areas. Are there any terms related to the code? Are there any terms related to the statistical modeling techniques? Are there any terms from the application domain? Are there any terms that might be needed to explain the dataset? 39 | 40 | ## How will this be reviewed? 41 | 42 | Your Curriculum Lead will discuss your responses to the brainstorming questions. They will not be formally reviewed (though they provide important context for reviewers). 43 | -------------------------------------------------------------------------------- /docs/courses/design/brainstorming-problems.md: -------------------------------------------------------------------------------- 1 | # Step 1.1 - What problem(s) will student learn how to solve? 2 | 3 | Write a list of ideas for problems that the students will encounter in the course. Don't worry about whether they are good or bad ideas, and don't worry about the order. Filtering and sorting comes later. 4 | 5 | 6 | ## Examples 7 | 8 | From a course on generalized additive models: 9 | 10 | - How to use Generalized Additive Models to understand relationships between variables in data and make predictions. 11 | 12 | From a course on fraud detection: 13 | 14 | - How to identify and predict fraudulent transactions 15 | - How to effectively work with highly imbalanced data 16 | 17 | From a course on human resource analytics: 18 | 19 | - How to compare high- and low-performing groups (see Work Rules! pages 201, 343) 20 | - How to identify the most effective recruiting channel (how does this generalize?) 21 | - How to determine what's driving (attrition, high/low performance, etc.) 22 | 23 | 24 | ## FAQs 25 | 26 | ### How many items should I list? 27 | 28 | Many courses list four or five problems to solve. This helps to divide the course up into chapters later on. 29 | 30 | ### How long should items be? 31 | 32 | No more than a sentence, and often just a phrase. 33 | 34 | ### Can I break that rule? 35 | 36 | Sure! Don't feel obliged to stick to this format. Some courses list a single overarching problem to solve, and other courses list a dozen problems. 37 | 38 | ## Good ideas 39 | 40 | ### Add references 41 | 42 | If you come across good ideas for things to teach, make a note of where you found those ideas. For example, you can link to other syllabuses, or note pages of books that had a ideas on things to teach. 43 | 44 | ### Be exhaustive 45 | 46 | Don't be afraid to list bad ideas: it's better to have too many ideas at this stage than too few. One trick is to keep listing items until they start to get silly. You can include these items to ensure that you Curriculum Lead is concentrating when they review your work. 47 | 48 | 49 | ## Common problems and their solutions 50 | 51 | ### I can't think of any ideas 52 | 53 | - If you know what technology you want to use, try reading the documentation for it. 54 | 55 | - Read through the contents pages of books on the subject. Amazon's "Look inside" feature is useful for this. 56 | 57 | - Check Stack Overflow to see what questions people are asking about the topic. 58 | 59 | 60 | ## How will this be reviewed? 61 | 62 | Your Curriculum Lead will discuss your responses to the brainstorming questions. They will not be formally reviewed (though they provide important context for reviewers). 63 | 64 | -------------------------------------------------------------------------------- /docs/courses/exercises/README.md: -------------------------------------------------------------------------------- 1 | # Exercises 2 | 3 | Every course is [organized into chapters](https://authoring.datacamp.com/courses/design/#terminology-and-structure) consisting of one or more exercises. If you created a course repository through [www.datacamp.com/teach](https://www.datacamp.com/teach), your chapter files will already contain some DataCamp exercises to start from. 4 | 5 | DataCamp supports variety of different exercises, each of which consists of several blocks. Some types of blocks are used by many exercises, while others are exercise-specific. Whenever possible, choose a coding exercise over a non-coding exercise: people come to us for hands-on instruction, and having them use what they're learning right away improves retention. 6 | 7 | Whatever types of exercises you choose, it is essential that they be *reproducible*: anyone with the right software must be able to re-run them and get the answer that you expect. The "anyones" you must initially satisfy are your Curriculum Lead, our Content Developers (who will be in charge of final edits and of deploying your course), and our automated back end (which must be able to run your code and its correctness tests unsupervised). This requirement means that it isn't practical to use live data feeds in exercises, since their contents may change outside your control. Instead, unless you have explicitly agreed it with your Curriculum Lead, you should always rely on archived datasets (either those included with the packages you are teaching or those you have explicitly included in your lesson). 8 | 9 | ## Exercise Types {#exercise-types} 10 | 11 | These types of exercises are currently supported: 12 | 13 | | Type | Description | 14 | |:---------------------------------------------------------------------|:------------| 15 | | [`VideoExercise`](video-exercise.md) | Displays a video exercise | 16 | | [`NormalExercise`](normal-exercises) | Instructions, exercise, code editor, and console | 17 | | [`MultipleChoiceExercise`](multiple-choice-exercise.md) | Multiple choice question and console | 18 | | [`PureMultipleChoiceExercise`](multiple-choice-exercise.md#pure-mce) | Multiple choice question without a console | 19 | | [`TabExercise`](tab-exercise.md) | A series of connected sub-exercises | 20 | | [`BulletExercise`](bullet-exercise.md) | A series of connected sub-exercises | 21 | 22 | 23 | ![DataCamp for Teachers - Dashboard](/images/exercise-decision-tree.png) 24 | _What Exercise Should I Use?_ 25 | -------------------------------------------------------------------------------- /docs/mobile/practice/README.md: -------------------------------------------------------------------------------- 1 | # Mobile Practice 2 | 3 | ## Authoring 4 | 5 | Mobile practice pools share an authoring format with [desktop 6 | challenges](/challenges/README.md). Therefore you can use the online DataCamp 7 | editor to edit mobile practice pools (which is not the case for mobile 8 | courses). For more information about using the teach editor to author 9 | challenge/practice exercises, see the [desktop challenges 10 | documentation](/challenges/README.md). 11 | 12 | The only material difference is that you should use the "mobile-preview" pane to 13 | see how a particular exercise will render in the mobile app. Note that you will 14 | need to manually size the pane to a width consistent with the width of a mobile 15 | device. 16 | 17 | ## Deploying 18 | 19 | 1. Make sure that the `pool.yml` file in your pool repository has a 20 | `mobile-pool-key` entry. Randomly generate a UUID for this if none exists 21 | already. 22 | 2. In the `mobile-content` repository, add an entry for the pool. 23 | 24 | ```yaml 25 | # Writing Functions in R 26 | - key: 3c3088e8-27f4-49d0-b5a0-492b1d90059a 27 | status: LIVE 28 | isPremium: true 29 | badgeUrl: https://s3.amazonaws.com/assets.datacamp.com/mobile/practice_badges/R+Programming.png 30 | course: 31 | key: a690e8e8-de36-49e6-b113-35808fce7d30 32 | title: Cleaning Data in R 33 | description: '' 34 | mainId: 1008 35 | technologyKey: R 36 | ``` 37 | 38 | - The `key` should be equal to the `mobile_pool_key` value. 39 | - The status should be LIVE when live or HIDDEN if it should not be shown 40 | anymore (don’t just delete it). 41 | - The practice badge should be according to the topic on main-app. I’ll 42 | provide a list down below 43 | - For the course part: 44 | - If it’s a course for which there is a mobile equivalent, use `courseKey` 45 | (https://github.com/datacamp/mobile-content/blob/master/Pools.yml#L6) 46 | - If it’s a desktop-only course, use `course` 47 | (e.g. https://github.com/datacamp/mobile-content/blob/master/Pools.yml#L32-L37), 48 | the key for the course should be generated. Title and description is not 49 | super important. The mainId should map to the course on main-app that is 50 | live (it’s used for the progress sharing!!!). The technology should be one 51 | of PYTHON, R, SQL. 52 | 3. Your mobile pool will now be visible in the development app. Check to make 53 | sure that everything works as intended. 54 | 4. In the pool repository, submit a PR request to have your `mobile-development` 55 | branch merged into `mobile-master`. 56 | 5. After the PR has been reviewed, merge the changes into `mobile-master`. 57 | -------------------------------------------------------------------------------- /docs/courses/exercises/examples/md/sql/BulletExercise.md: -------------------------------------------------------------------------------- 1 | # SQL Bullet exercise example 2 | 3 | ## SELECT DISTINCT 4 | 5 | ```yaml 6 | type: BulletExercise 7 | lang: sql 8 | xp: 100 9 | ``` 10 | 11 | Often your results will include many duplicate values. If you want to select all the unique values from a column, you can use the `DISTINCT` keyword. 12 | 13 | This might be useful if, for example, you're interested in knowing which languages are represented in the `films` table: 14 | 15 | ```sql 16 | SELECT DISTINCT language 17 | FROM films; 18 | ``` 19 | 20 | Remember, you can check out the data in the tables by clicking on the tabs to the right under the editor! 21 | 22 | `@pre_exercise_code` 23 | 24 | ```{python} 25 | connect('postgresql', 'films') 26 | set_options(visible_tables = ['films', 'roles']) 27 | ``` 28 | 29 | `@sample_code` 30 | 31 | ```{sql} 32 | ``` 33 | 34 | *** 35 | 36 | ## Unique Countries 37 | 38 | ```yaml 39 | type: NormalExercise 40 | xp: 30 41 | ``` 42 | 43 | `@instructions` 44 | 45 | Get all the unique countries represented in the `films` table. 46 | 47 | `@solution` 48 | 49 | ```{sql} 50 | SELECT DISTINCT country 51 | FROM films; 52 | ``` 53 | 54 | `@hint` 55 | 56 | ``` 57 | SELECT DISTINCT ___ 58 | FROM ___; 59 | ``` 60 | 61 | `@sct` 62 | 63 | ```{python} 64 | # SCT comes here, see sqlwhat.readthedocs.io 65 | ``` 66 | 67 | *** 68 | 69 | ```yaml 70 | type: NormalExercise 71 | xp: 30 72 | ``` 73 | 74 | `@instructions` 75 | 76 | Get all the different film certifications from the `films` table. 77 | 78 | `@solution` 79 | 80 | ```{sql} 81 | SELECT DISTINCT certification 82 | FROM films; 83 | ``` 84 | 85 | `@hint` 86 | 87 | ``` 88 | SELECT DISTINCT ___ 89 | FROM ___; 90 | ``` 91 | 92 | `@sct` 93 | 94 | ```{python} 95 | # SCT comes here, see sqlwhat.readthedocs.io 96 | ``` 97 | 98 | *** 99 | 100 | ```yaml 101 | type: NormalExercise 102 | xp: 30 103 | ``` 104 | 105 | `@instructions` 106 | 107 | Get the different types of film roles from the `roles` table. 108 | 109 | `@solution` 110 | 111 | ```{sql} 112 | SELECT DISTINCT role 113 | FROM roles; 114 | ``` 115 | 116 | `@hint` 117 | 118 | ``` 119 | SELECT DISTINCT ___ 120 | FROM ___; 121 | ``` 122 | 123 | `@sct` 124 | 125 | ```{python} 126 | # SCT comes here, see sqlwhat.readthedocs.io 127 | ``` 128 | -------------------------------------------------------------------------------- /docs/courses/exercises/examples/md/r/TabExercise.md: -------------------------------------------------------------------------------- 1 | # R Tab exercise example 2 | 3 | ## Advanced Group By Exercises 4 | 5 | ```yaml 6 | type: TabExercise 7 | lang: r 8 | xp: 100 9 | ``` 10 | 11 | By now you've learned the fundamentals of `dplyr`: the five data manipulation verbs and the additional `group_by()` function to discover interesting group-wise statistics. This exercise brings together these concepts and provides you with an opportunity to combine them to answer some interesting questions. 12 | 13 | Let us suppose we want to find the most visited destination for each carrier. Before reading ahead, please spend a couple of minutes thinking about how you might go about solving this exercise using dplyr. 14 | 15 | As this is the first time you are combining multiple dplyr concepts, we have broken this exercise down into smaller steps. Each step will allow you to focus on a specific concept. 16 | 17 | `@pre_exercise_code` 18 | 19 | ```{r} 20 | library(dplyr) 21 | library(hflights) 22 | ``` 23 | 24 | `@sample_code` 25 | 26 | ```{r} 27 | hflights %>% 28 | 29 | ``` 30 | 31 | *** 32 | 33 | ```yaml 34 | type: NormalExercise 35 | xp: 30 36 | ``` 37 | 38 | `@instructions` 39 | 40 | Compute for every carrier, the aggregate number of visits to each destination. 41 | 42 | `@solution` 43 | 44 | ```{r} 45 | hflights %>% 46 | group_by(UniqueCarrier, Dest) %>% 47 | summarise(n = n()) 48 | ``` 49 | 50 | `@sct` 51 | 52 | ```{r} 53 | # Test ... 54 | ``` 55 | 56 | *** 57 | 58 | ```yaml 59 | type: NormalExercise 60 | xp: 30 61 | ``` 62 | 63 | `@instructions` 64 | 65 | Rank the aggregate number of visits for every carrier. 66 | 67 | `@solution` 68 | 69 | ```{r} 70 | hflights %>% 71 | group_by(UniqueCarrier, Dest) %>% 72 | summarise(n = n()) %>% 73 | mutate(rank = rank(desc(n))) 74 | ``` 75 | 76 | `@sct` 77 | 78 | ```{r} 79 | # Test ... 80 | ``` 81 | 82 | *** 83 | 84 | ## Filter 85 | 86 | ```yaml 87 | type: NormalExercise 88 | xp: 30 89 | ``` 90 | 91 | `@instructions` 92 | 93 | Filter the results to only return the top ranked destination for every carrier. 94 | 95 | `@solution` 96 | 97 | ```{r} 98 | hflights %>% 99 | group_by(UniqueCarrier, Dest) %>% 100 | summarise(n = n()) %>% 101 | mutate(rank = rank(desc(n))) %>% 102 | filter(rank == 1) 103 | ``` 104 | 105 | `@sct` 106 | 107 | ```{r} 108 | # Test ... 109 | ``` 110 | -------------------------------------------------------------------------------- /docs/courses/exercises/examples/md/sql/TabExerciseWithMultipleChoice.md: -------------------------------------------------------------------------------- 1 | ## TabExercise with MultipleChoice Subexercise 2 | 3 | ```yaml 4 | type: TabExercise 5 | ``` 6 | 7 | This is a tabexercise. Great! Super great! 8 | XP should be defined at the subexercise level 9 | 10 | `@pre_exercise_code` 11 | 12 | ```{r} 13 | connect('postgresql', 'dvdrental') 14 | ``` 15 | 16 | *** 17 | 18 | 19 | 20 | ```yaml 21 | type: NormalExercise 22 | xp: 10 23 | ``` 24 | `@instructions` 25 | 26 | Select the `film_id` from film 27 | 28 | `@hint` 29 | 30 | Here's a hint for instruction 1: use `film_id` 31 | 32 | `@sample_code` 33 | 34 | ```{sql} 35 | SELECT * FROM film; 36 | ``` 37 | 38 | `@solution` 39 | 40 | ```{sql} 41 | SELECT film_id FROM film; 42 | ``` 43 | 44 | `@sct` 45 | 46 | ```{python} 47 | Ex().check_result() 48 | ``` 49 | 50 | *** 51 | 52 | 53 | 54 | ```yaml 55 | type: MultipleChoiceExercise 56 | xp: 20 57 | ``` 58 | `@question` 59 | 60 | What do you think? 61 | 62 | `@possible_answers` 63 | 64 | - One 65 | - Two 66 | - Three 67 | - Four 68 | 69 | `@sample_code` 70 | 71 | ```{sql} 72 | ``` 73 | 74 | `@sct` 75 | 76 | ```{python} 77 | msg1 = "Option 1 is wrong.." 78 | msg2 = "Option 2 is correct, great!" 79 | msg3 = "Option 3 is wrong.." 80 | msg4 = "Option 4 is wrong.." 81 | Ex().has_chosen(2,[msg1,msg2,msg3,msg4]) 82 | ``` 83 | 84 | *** 85 | 86 | 87 | 88 | ```yaml 89 | type: NormalExercise 90 | xp: 30 91 | ``` 92 | `@sample_code` 93 | 94 | ```{sql} 95 | SELECT ___, ___ FROM ___; 96 | ``` 97 | 98 | `@instructions` 99 | 100 | Select the `film_id` and `title` from `film`. 101 | 102 | `@hint` 103 | 104 | Here's a hint for instruction 3: Use `film_id, title`. 105 | 106 | `@solution` 107 | 108 | ```{sql} 109 | SELECT film_id, title FROM film 110 | ``` 111 | 112 | `@sct` 113 | 114 | ```{python} 115 | Ex().check_result() 116 | ``` 117 | 118 | *** 119 | 120 | 121 | 122 | ```yaml 123 | type: NormalExercise 124 | xp: 40 125 | ``` 126 | `@instructions` 127 | 128 | Select all columns from `film`. 129 | 130 | `@sample_code` 131 | 132 | ```{sql} 133 | SELECT ___ FROM ___; 134 | ``` 135 | 136 | `@solution` 137 | 138 | ```{sql} 139 | SELECT * FROM film 140 | ``` 141 | 142 | `@sct` 143 | 144 | ```{python} 145 | Ex().check_result() 146 | ``` 147 | 148 | *** 149 | 150 | 151 | 152 | ```yaml 153 | type: NormalExercise 154 | xp: 50 155 | ``` 156 | `@instructions` 157 | 158 | Get all columns from `film`, but just get 5 rows. 159 | 160 | `@hint` 161 | 162 | Here's a hint for task 5: Use `LIMIT 5`. 163 | 164 | `@sample_code` 165 | 166 | ```{sql} 167 | ___ 168 | ``` 169 | 170 | `@solution` 171 | 172 | ```{sql} 173 | SELECT * FROM film LIMIT 5 174 | ``` 175 | 176 | `@sct` 177 | 178 | ```{python} 179 | Ex().check_result() 180 | ``` 181 | -------------------------------------------------------------------------------- /docs/courses/exercises/technical-details/unified-authoring-api.md: -------------------------------------------------------------------------------- 1 | # Unified Authoring Format 2 | 3 | The basic objective of the unified authoring format is to come up with a simple, unified API for all DataCamp content. The unified format specifies metadata, sections, sub-sections, content blocks, and sub-blocks that allow consistent authoring of exercises, challenges, projects, and other content. The format is simple but flexible, and renders well on GitHub and elsewhere. 4 | 5 | ## Metadata 6 | 7 | > Every document starts with YAML metadata between triple-dash separators. 8 | 9 | --- 10 | title_meta : Chapter 1 11 | title : Intro to basics 12 | description : "In this chapter, you will take your first steps with R." 13 | --- 14 | 15 | ## Sections 16 | 17 | > Every document consists of sections and subsections delimited by `---` and `***` separators. 18 | 19 | --- 20 | title_meta : Chapter 1 21 | title : Intro to basics 22 | description : "In this chapter, you will take your first steps with R." 23 | --- 24 | 25 | Section 1 > Main 26 | 27 | *** 28 | 29 | Section 1 > Subsection 1 30 | 31 | *** 32 | 33 | Section 1 > Subsection 2 34 | 35 | --- 36 | 37 | Section 2 > Main 38 | 39 | *** 40 | 41 | Section 2 > Subsection 1 42 | 43 | 44 | ## Blocks 45 | 46 | > Every section or subsection can contain title, metadata, and content blocks. 47 | 48 | ## Title 49 | 50 | ```yaml 51 | key1: value1 52 | key2: value2 53 | ``` 54 | 55 | Content Block Main 56 | 57 | `@pre_exercise_code` 58 | 59 | Content Block 1 60 | 61 | `@sample_code` 62 | 63 | `@@file1` 64 | 65 | Content Block 2 > Sub Block 1 66 | 67 | `@@file2` 68 | 69 | Content Block 2 > Sub Block 2 70 | 71 | A content block is identified by a `@blockname` tag that is enclosed within backticks. A content block can contain sub-blocks identified by `@@sub-block-name`, also enclosed within backticks. 72 | 73 | ## Segments 74 | 75 | > Content blocks can be code blocks with multiple segments and YAML metadata. 76 | 77 | ```{r} 78 | # The vector pioneers has already been created for you. 79 | pioneers <- c("GAUSS:1777", "BAYES:1702", "PASCAL:1623", "PEARSON:1857") 80 | 81 | # @step 82 | # --- 83 | # blanks: [":"] 84 | # --- 85 | # Split names from birth year 86 | split_math <- strsplit(pioneers, split = ":") 87 | 88 | # @step 89 | # Convert to lowercase strings: split_low 90 | # --- 91 | # blanks: ["tolower"] 92 | # --- 93 | split_low <- lapply(split_math, tolower) 94 | 95 | # Take a look at the structure of split_low 96 | # @step 97 | # --- 98 | # blanks: ["str"] 99 | # --- 100 | str(split_low) 101 | ``` 102 | -------------------------------------------------------------------------------- /docs/courses/exercises/all-exercise-types/hints.md: -------------------------------------------------------------------------------- 1 | # Writing Hints 2 | 3 | This page describes how to write the hints that students can ask for to help them complete the exercise. 4 | 5 | ## Examples 6 | 7 | From [Repetition](https://campus.datacamp.com/courses/string-manipulation-in-r-with-stringr/pattern-matching-with-regular-expressions?ex=8) in "String Manipulation in R with stringr". The hints refer to knowledge that the students already have from previous exercises. 8 | 9 | > - The input to the `negated_char_class()` is the same as that of `char_class()` you used in the previous exercise. 10 | > - Wrapping `exactly()` around a pattern is the same as specifying the pattern in between `START %R%` and `%R% END` like you've done before. 11 | 12 | From [Specifying the Microwave Oven class](https://campus.datacamp.com/courses/object-oriented-programming-in-r-s3-and-r6/using-r6?ex=2) in "Object-Oriented Programming in R: S3 & R6". The hints focus on anticipating students' mistakes (misspelling; wrong assignment operator) rather than providing solution code. 13 | 14 | > - The class name is case sensitive. Did you spell `"MicrowaveOven"` correctly? 15 | > - Use `=` for assigning arguments within the call to `R6Class`. For example, `private = list()`, not `private <- list()`. 16 | > - Similarly, use `power_rating_watts = 800`, not `power_rating_watts <- 800`. 17 | 18 | 19 | ## FAQs 20 | 21 | ### How much help should each hint provide? 22 | 23 | A good heuristic is that the hint should get the student half way to the answer. 24 | 25 | ### How many hints should I provide? 26 | 27 | One hint per instruction is a good starting point. For easier exercises, this may reveal too much of the solution, and for harder exercises it may not cover all the common problems that students have, so you are free to use your judgement and have greater or fewer hints if necessary. 28 | 29 | 30 | ## Good ideas 31 | 32 | ### Jog students' memories 33 | 34 | A common reason that students may fail to be able to complete an exercise is that they have forgotten something they learned in a previous exercise. You can use the hint to jog their memory. 35 | 36 | ### Anticipate a problem 37 | 38 | Often there are a few specific things that students will get wrong. You can use the hint to address these things. 39 | 40 | 41 | ## Common problems and their solutions 42 | 43 | ### Providing the answer 44 | 45 | It can be tempting to solve the problem of an exercise being too hard by providing a chunk of the solution in the hint. If an exercise is reduced to a "copy and paste" problem, the student doesn't learn much, so this is discouraged. In general, try to phrase the hint so some thinking is still required to solve the exercise. 46 | 47 | ### Repeating the instruction 48 | 49 | The opposite problem is that hints can simply repeat or rephrase information in the instructions, without providing any new help. Since students have to spend XP to see the hint, this is a big source of frustration. 50 | -------------------------------------------------------------------------------- /docs/courses/exercises/examples/ipynb/python/MultipleChoiceExercise.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "collapsed": true, 7 | "tags": [ 8 | "type:MultipleChoiceExercise", 9 | "lang:python", 10 | "xp:50", 11 | "skills:2", 12 | "key:9703b117fb" 13 | ] 14 | }, 15 | "source": [ 16 | "## When to use Python?\n", 17 | "\n", 18 | "Python is a pretty versatile language. For what applications can you use Python?\n" 19 | ] 20 | }, 21 | { 22 | "cell_type": "markdown", 23 | "metadata": { 24 | "collapsed": true, 25 | "tags": [ 26 | "@instructions" 27 | ] 28 | }, 29 | "source": [ 30 | "- You want to do some quick calculations.\n", 31 | "- For your new business, you want to develop a database-driven website.\n", 32 | "- Your boss asks you to clean and analyze the results of the latest satisfaction survey.\n", 33 | "- All of the above.\n" 34 | ] 35 | }, 36 | { 37 | "cell_type": "markdown", 38 | "metadata": { 39 | "collapsed": true, 40 | "tags": [ 41 | "@hint" 42 | ] 43 | }, 44 | "source": [ 45 | "Filip mentioned in the video that Python can be used to build practically any piece of software.\n" 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": null, 51 | "metadata": { 52 | "collapsed": true, 53 | "tags": [ 54 | "@pre_exercise_code" 55 | ] 56 | }, 57 | "outputs": [], 58 | "source": [ 59 | "# pec comes here" 60 | ] 61 | }, 62 | { 63 | "cell_type": "code", 64 | "execution_count": null, 65 | "metadata": { 66 | "collapsed": true, 67 | "tags": [ 68 | "@sct" 69 | ] 70 | }, 71 | "outputs": [], 72 | "source": [ 73 | "msg1 = \"Incorrect. Python can do simple and quick calculations, but it is much more than that!\"\n", 74 | "msg2 = \"Incorrect. There is a very popular framework to build database-driven websites (Django), but Python can do much more.\"\n", 75 | "msg3 = \"Incorrect. Python is a powerful tool to do data analysis, but you can also use it for other ends.\"\n", 76 | "msg4 = \"Correct! Python is an extremely versatile language.\"\n", 77 | "Ex().has_chosen(4, [msg1, msg2, msg3, msg4])\n" 78 | ] 79 | } 80 | ], 81 | "metadata": { 82 | "celltoolbar": "Tags", 83 | "kernelspec": { 84 | "display_name": "Python 3", 85 | "language": "python", 86 | "name": "python3" 87 | }, 88 | "language_info": { 89 | "codemirror_mode": { 90 | "name": "ipython", 91 | "version": 3 92 | }, 93 | "file_extension": ".py", 94 | "mimetype": "text/x-python", 95 | "name": "python", 96 | "nbconvert_exporter": "python", 97 | "pygments_lexer": "ipython3", 98 | "version": "3.6.2" 99 | } 100 | }, 101 | "nbformat": 4, 102 | "nbformat_minor": 2 103 | } 104 | -------------------------------------------------------------------------------- /docs/courses/exercises/technical-details/exercise-blocks.md: -------------------------------------------------------------------------------- 1 | # Exercise blocks 2 | 3 | Exercises may contain the following kinds of blocks: 4 | 5 | | Block | Video | Normal | MultipleChoice | PureMultipleChoice | 6 | |---------------------|-------------------:|-------------------:|-------------------:|-------------------:| 7 | | `title` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | 8 | | `assignment` | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | 9 | | `instructions` | :x: | :white_check_mark: | :white_check_mark: | :white_check_mark: | 10 | | `hint` | :x: | :white_check_mark: | :white_check_mark: | :white_check_mark: | 11 | | `pre_exercise_code` | :x: | :white_check_mark: | :white_check_mark: | :white_check_mark: | 12 | | `sample_code` | :x: | :white_check_mark: | :x: | :x: | 13 | | `solution` | :x: | :white_check_mark: | :x: | :x: | 14 | | `sct` | :x: | :white_check_mark: | :white_check_mark: | :x: | 15 | | `possible_answers` | :x: | :x: | :x: | :white_check_mark: | 16 | | `feedbacks` | :x: | :x: | :x: | :white_check_mark: | 17 | 18 | > #### info::Note 19 | > `TabExercise` and `BulletExercise` are not included in the comparison table because they are combinations of other exercise types. 20 | 21 | - `title`: title of the exercise shown to students taking the course. 22 | - `assignment`: describes the task the student is to solve. 23 | - `instructions`: the actual question or task for the student. In the case of a `MultipleChoiceExercise`, the instructions list the options from which the student can choose. 24 | - `hint`: a hint the student can request. 25 | - `pre_exercise_code`: code run in the background when the exercise is loaded to load necessary libraries, define variables, etc. 26 | - `sample_code`: starter code made available to the user at the beginning of the exercise. 27 | - `solution`: a correct solution to an interactive exercise. DataCamp's back end runs this code when building the course to check that the exercise's submission tests run correctly. 28 | - `sct`: the exercise's submission correctness tests (described below). 29 | - `video_link`: the link to the video (`VideoExercise` only). 30 | - `aspect_ratio`: the aspect ratio (`VideoExercise` only). 31 | - `possible_answers`: a list of possible answers and a correct answer (`PureMultipleChoiceExercise` only). See [How to create PureMultipleChoiceExercise](multiple-choice-exercise.md#pure-mce) for details. 32 | - `feedbacks`: a list with feedback for each possible answer (`PureMultipleChoiceExercise` only). See [How to create PureMultipleChoiceExercise](multiple-choice-exercise.md#pure-mce) for details. 33 | -------------------------------------------------------------------------------- /docs/projects/projects-narrative-format.md: -------------------------------------------------------------------------------- 1 | The format of a Narrative notebook 2 | ========================================= 3 | 4 | If you are following [the project creation process](projects-process.md), then one of the first steps is to create the *narrative notebook*. 5 | 6 | The *narrative notebook* is a Jupyter notebook that only contains the case study / analysis / data narrative the DataCamp Project is built around. For the student, the goal of a Project is then to recreate this narrative notebook by completing the missing code in the student's notebook. 7 | 8 | 9 | ![](media/narrative_notebook_location.png) 10 | 11 | The narrative notebook starts with the Project title: a `markdown` cell with a single H1 header, like this: 12 | 13 | ``` 14 | # This is the Title of the Project 15 | ``` 16 | 17 | Then follows around 8 to 10 *tasks*, where each task consists of 18 | 19 | 1. **Task title** - A `markdown` cell with the title of the task written as a H2 header: `## 1. Like this` 20 | 2. **Context** - A single `markdown` cell with text/story/description. 21 | 3. **Code** - A single `code` cell with the code of the task. 22 | 23 | (If one was writing, say, a blog post or an analysis, one wouldn't usually split it up into *tasks*. But this is necessary to do for the narrative notebook to later map each task to instructions.) 24 | 25 | **Example of a narrative notebook task** 26 | ![](media/narrative_task_example.png) 27 | 28 | **Style guide:** 29 | - **General** 30 | - The narrative notebook is not addressed directly to the student. Rather, it's supposed to read as an analysis / case study / blog post written for a general audience. 31 | - **Task title cell** 32 | - The title of the task should be manually numbered: `## 3. Like this` 33 | - **Context cell** 34 | - Keep it short. One sentence is fine, 800 characters is max. 35 | - Make sure that images you include have a permissive license. 36 | - **Code cell** 37 | - It should take *at most* 5 seconds to execute on an average laptop. 38 | - It should consist of between 1 to 10 lines of code. 39 | - For python 40 | - Use `underscore_separated` identifiers. 41 | - Use 'single quotes' for strings. 42 | - For R 43 | - Use `underscore_separated` identifiers. 44 | - Use "double quotes" for strings. 45 | - Use the `<-` arrow for assignment. 46 | 47 | > #### info::Check out an existing narrative notebook! 48 | > Maybe the easiest way of understanding the structure of a narrative notebook is to look at an example. Here are the R and python narrative notebooks behind the project *Dr. Semmelweis and the discovery of handwashing*. Here is the [python narrative notebook](https://github.com/datacamp/projects-discovery-of-handwashing-python/blob/master/project_narrative.ipynb) (and [live project](https://projects.datacamp.com/projects/20)), here is the [R narrative notebook](https://github.com/datacamp/projects-discovery-of-handwashing-r/blob/master/project_narrative.ipynb) (and [live project](https://projects.datacamp.com/projects/49)). -------------------------------------------------------------------------------- /docs/courses/spreadsheets/exercises/meta.md: -------------------------------------------------------------------------------- 1 | # Meta 2 | 3 | ``` 4 | Exercise - Meta 5 | ``` 6 | 7 | This is the sheet where you put all the general information of spreadsheets. This is information 8 | that can be described as key-value pairs (for example `title: Sheets course`). The information is 9 | described in column `A` and column `B`, where `A` holds the keys (like `title`) and `B` holds the 10 | values (like `Sheets course`). This might look something like this: 11 | 12 |
13 | 14 | 18 | 19 |
20 | 21 | Specifically, the following fields can be set: 22 | 23 | * **title**: title of the exercise - plain text 24 | * **assignment**: assignment of the exercise - markdown rendered text 25 | * **instructions**: instructions of the exercise - markdown rendered text, for instructions we 26 | always use between 2-4 bullet points 27 | * **hint**: hint of the exercise - markdown rendered text, for a hint we always use between 2-4 28 | bullet points 29 | * **highlight**: specifies which parts of the sheet are highlighted when the user lands on the 30 | exercise - one range (e.g. `F5`, `F5:G6`, ...) or a list of ranges, separated by a semicolon 31 | (e.g. `F5;F5:G6`) 32 | * **success_message**: success_message of the exercise. This will be shown when an exercises is 33 | completed. 34 | * **type**: the type of the exercise. More on this in the [section about other 35 | exercises](../other_exercises.md). Defaults to `NormalExercise`. 36 | * **data_selectors**: this is a field that gives you control over what data is preserved between 37 | exercises. As we mentioned before, not all data is preserved between exercises (that's what 38 | we need a Golden Copy for). More info on this will follow in the part about the [solution 39 | sheet](solution.md). The `data_selectors` field lets you control which data is preserved. 40 | The value should be a list of keywords, separated by a comma (`,`). E.g. `values, formulas`. 41 | The keywords are: 42 | 43 | * values: the raw values in each cell, no formulas 44 | * formulas: the formulas in each cell 45 | * numberFormat: the number format in each cell. This controls whether `0` is shown as `$0` or 46 | `0.00`, for example 47 | * pivotTables: all pivot tables in the sheet 48 | * charts: all charts in the sheet 49 | * styles: all style information in the sheet. This includes column widths, row widths, borders, 50 | and number format. It does __**not**__ include merging cells or conditional formatting. Note 51 | that including styles will cause the `highlight` field to be ignored. This keyword is a 52 | superset of `numberFormat`. You can use them both, but using only `styles` will have the 53 | same effect. 54 | 55 | If no `data_selectors` are set, the default is `values, formulas, numberFormat, pivotTables, 56 | charts`. 57 | -------------------------------------------------------------------------------- /docs/courses/design/brainstorming-concepts.md: -------------------------------------------------------------------------------- 1 | # Step 1.2 - What techniques or concepts will students learn? 2 | 3 | Write a list of ideas for techniques and concepts that you want to teach in the course. As with the previous question, don't worry about whether they are good or bad ideas, and don't worry about the order. Filtering and sorting comes later. 4 | 5 | ## Examples 6 | 7 | From a course on human resource analytics. This example references where an idea came from. 8 | 9 | - How to compare high- and low-performing groups (see Work Rules! pages 201, 343) 10 | - How to identify the most effective recruiting channel (how does this generalize?) 11 | - How to determine what's driving (attrition, high/low performance, etc.) 12 | 13 | From a course on generalized additive models. This example distinguishes *concepts* from *skills and techniques*, and explicitly rejects ideas by specifying *things to leave out*. 14 | 15 | *Concepts* 16 | 17 | - Splines, Basis Functions 18 | - Model formulas 19 | - Additivity vs Interactions 20 | - Smoothing 21 | - Penalization 22 | 23 | *Skills/Techniques* 24 | 25 | - Fitting a GAM to data 26 | - Checking that a GAM fits well 27 | - Visualizing a GAM 28 | - Making predictions 29 | - Selecting predictor variables (maybe too much) 30 | - Fitting, checking, visualizing a model with binary outcomes 31 | 32 | *Things to leave out* 33 | 34 | - It seems a bridge too far to go too far into the "generalized" part of GAMs in this course and discuss much about outcome distributions, at least beyond a binary example. This could be a bonus section with "This will be easier if you have learned about GLMs", but I don't know if that works within your infrastructure. 35 | - It also may make sense to skip most of the different types of basis functions and splines one could potentially use. 36 | 37 | 38 | ## FAQs 39 | 40 | ### How many items should I list? 41 | 42 | This varies a lot from course to course, but is typically between two and twenty items. 43 | 44 | ## Good ideas 45 | 46 | ### Add references 47 | 48 | If you come across good ideas for things to teach, make a note of where you found those ideas. For example, you can link to other syllabuses, or note pages of books that had a ideas on things to teach. 49 | 50 | ### Be exhaustive 51 | 52 | Don't be afraid to list bad ideas: it's better to have too many ideas at this stage than too few. One trick is to keep listing items until they start to get silly. You can include these items to ensure that you Curriculum Lead is concentrating when they review your work. 53 | 54 | ## Common problems and their solutions 55 | 56 | ### I can't think of any ideas 57 | 58 | - If you know what technology you want to use, try reading the documentation for it. 59 | 60 | - Read through the contents pages of books on the subject. Amazon's "Look inside" feature is useful for this. 61 | 62 | - Wikipedia has a big [list of statistical articles](https://en.wikipedia.org/wiki/List_of_statistics_articles). 63 | 64 | ## How will this be reviewed? 65 | 66 | Your Curriculum Lead will discuss your responses to the brainstorming questions. They will not be formally reviewed (though they provide important context for reviewers). 67 | 68 | -------------------------------------------------------------------------------- /docs/courses/exercises/all-exercise-types/success-message.md: -------------------------------------------------------------------------------- 1 | # Success Messages 2 | 3 | This page describes how to write the success message that appears when the student completes the exercise. 4 | 5 | ## Examples 6 | 7 | From [Working with parquet files](https://campus.datacamp.com/courses/introduction-to-spark-in-r-using-sparklyr/case-study-learning-to-be-a-machine-running-machine-learning-models-on-spark?ex=4) in "Introduction to Spark in R using sparklyr". This has a creative piece of praise, followed by a heuristic that is useful to know, but hard to demonstrate directly in the exercise. 8 | 9 | > Smooth as some parquet flooring! Reading and writing Parquet files is much quicker than reading and writing CSV files, and typically faster than using `copy_to()`. 10 | 11 | From [Exploring ggplot2, part 1](https://campus.datacamp.com/courses/data-visualization-with-ggplot2-1/chapter-1-introduction-f5aef4fe-3bbb-4e18-b29a-8fb1361d7835?ex=3) in "Data Visualization with ggplot2 (Part 1)". This begins with (almost) alliterative praise, followed by a comment that draws the student's attention to the plot that they just drew. It mentions a problem that motivates the following exercise. 12 | 13 | > Phenomenal plotting! Notice that `ggplot2` treats `cyl` as a continuous variable. You get a plot, but it's not quite right, because it gives the impression that there is such a thing as a 5 or 7-cylinder car, which there is not. 14 | 15 | ## FAQs 16 | 17 | ### How do I think of good praise? 18 | 19 | In R, you can use the praise package. In particular, [`praise::praise_parts`](https://www.rdocumentation.org/packages/praise/topics/praise_parts) lists many positive words, categorized as adjectives and abverbs. Another possibility using R is 20 | 21 | ```r 22 | library(tidytext) 23 | library(dplyr) 24 | get_sentiments() %>% arrange(desc(score)) 25 | ``` 26 | 27 | Failing that, try a thesaurus! 28 | 29 | ### How long should the success message be? 30 | 31 | The message should consist of a few words of praise followed by one of two sentences of something informative. Do not write an essay here! 32 | 33 | ## Good ideas 34 | 35 | ### Be creative about the praise 36 | 37 | "Great!" is not as great as you think! It's good to have a bit of variation. Try using rhymes or alliteration, and relating the praise to the contents of the exercise. 38 | 39 | ### Draw attention to the results 40 | 41 | For exercises that get the students to calculate results or draw a plot, it's very easy for the student to complete the exercise then not actually look at what they've just done. A success message that highlights interesting results can be used to get the students to go back and look at what they just made. 42 | 43 | ### Motivate the next exercise 44 | 45 | By highlighting a problem with something in the exercise, you can motivate the contents of the next exercise (where you solve that problem). 46 | 47 | ## Common problems and their solutions 48 | 49 | ### Not writing anything 50 | 51 | It is technically possible to get away with not writing anything useful in the success message, but this is a wasted opportunity. Remember that the success mesage is the last thing the student sees before they rate your exercise! 52 | -------------------------------------------------------------------------------- /docs/courses/exercises/all-exercise-types/learning-objective.md: -------------------------------------------------------------------------------- 1 | # Writing Exercise-level Learning Objectives 2 | 3 | Decide upon a *single* measurable learning objective for an exercise. The learning objective of an exercise is typically that the student understands some syntax, a workflow, a concept, or a result. 4 | 5 | ## Examples 6 | 7 | ### Syntax 8 | 9 | Typically this means learning how to use a function. For example, 10 | 11 | > The student can calculate model predictions using `predict()`, knowing that this function takes a model object and a data frame as arguments. 12 | 13 | > The student knows that Python classes are initialized with a method named `__init__()`, and that this method takes `self` as the first argument. 14 | 15 | ### Workflow 16 | 17 | This usually means knowing what order several functions should be called in. It can also refer to more abstract workflow ideas. For example, 18 | 19 | > The student can calculate groupwise summary statistics with dplyr, by first calling `group_by()` then calling `summarize()`. 20 | 21 | > The student can articulate these modeling workflow steps: Split the data into training and testing sets, then train the model on the training set, then test the predictions on the testing set. 22 | 23 | ### Concepts 24 | 25 | An abstract idea, that can be either statistical, programming, or domain-specific. 26 | 27 | > The student understands the definition of autocorrelation. 28 | 29 | > The student can predict what happens when an error occurs inside a try-block. 30 | 31 | > The student can calculate how depreciation affects the value of a thing over time. 32 | 33 | ### Results 34 | 35 | An interesting thing found in the dataset being explored. 36 | 37 | > The student can interpret that on average R programmers live 8 years longer than SAS programmers. 38 | 39 | > The student can interpret that Python programmers are 10 times more likely to own a pet snake than non-Python programmers. 40 | 41 | ## FAQs 42 | 43 | ### Can I have multiple learning objectives? 44 | 45 | In general, an exercise should teach the student exactly one thing. If you want to have multiple learning objectives, it's a warning sign that you are trying to cram too much into a single exercise. That said, if you have several simple learning objectives, a multi-step exercise can be appropriate. 46 | 47 | ## Common problems and their solutions 48 | 49 | ### The exercise doesn't test the learning objectives 50 | 51 | It is important that the exercise meets the objective. One common danger is that you start writing code and somehow the exercise ends up being completely different to what you originally intended. This can be fine, but make sure that you are teaching the things that students will need to know for future exercises. 52 | 53 | ## Good ideas 54 | 55 | ### Write it down 56 | 57 | You are not currently obliged to write the learning objective down. It can very useful to articulate it though. Write it in HTML comments at the start of the exercise. 58 | 59 | ``` 60 | 63 | ``` 64 | 65 | ## See Also 66 | 67 | There is some related advice, including more pedagogic theory, in [Course-level learning objectives](courses/design/overview-objectives.md). 68 | -------------------------------------------------------------------------------- /docs/courses/guidelines/course-naming.md: -------------------------------------------------------------------------------- 1 | # Course Naming Rules 2 | 3 | ## Avoid `Introduction to` prefix 4 | 5 | This is reserved for free courses introducing technologies. Insturctors often request that their course be called "Introduction to" something to make it sound beginner friendly. However, the majority of our courses introduce something new, so it doesn't make sense from a curriculum point of view to allow this. 6 | 7 | Bad: "Introduction to Epidemiology in R" 8 | Good: "Descriptive Epidemiology in R" 9 | 10 | ## Use `in R/Python` suffix whenever possible 11 | 12 | The R and Python curricula have a lot of overlap. To avoid confusion, it is useful to specify the language in the name of the course. 13 | 14 | Bad: "Sentiment Analysis" 15 | Good: "Sentiment Analysis in Python" 16 | 17 | ## Maximum of 50(ish) characters 18 | 19 | The name must fit on a badge, and on adverts. There is a little leeway with the total number of characters but aim for less than 50. 20 | 21 | Bad: "Specifying Queries to Optimize Portfolio Returns Using Statistical Theory and Time Series Analysis in PostgreSQL" 22 | Good: "Portfolio Analysis in PostgreSQL" 23 | 24 | ## Be as specific as possible 25 | 26 | You have to bear in mind potential name clashes with courses that we haven't made yet! The title should accurately reflect the scope of the course. 27 | 28 | Bad: "Machine Learning in Python" 29 | Good: "Support Vector Machines for Survival Analysis in Python" 30 | 31 | ## Use Title Case 32 | 33 | [Important](http://www.grammar-monster.com/lessons/capital_letters_title_case.htm) Words get an Initial Upper Case Letter but Filler Words do Not. Technology or package names should be written using their usual casing; do not convert these to Title case. 34 | 35 | Note that this does not apply the GitHub repository name for the course, which should be in lower-shish-kebab-case. 36 | 37 | Bad: "BIG DATA in SPARK using SPARKR" 38 | Good: "Big Data in Spark using SparkR" 39 | 40 | ## Use internationally understandable names 41 | 42 | In particular, avoid the US university course numbering scheme (`101`, etc.). 43 | 44 | Bad: "Exploring Pitch Data in R" 45 | Good: "Exploring Baseball Pitch Data in R" 46 | 47 | ## Avoid abbreviations and acronyms 48 | 49 | Don't abbreviate words in order to try and hit the 50 character limit. Having to interpret the title discourages students from taking the course. Instead, try rewriting the title. 50 | 51 | Bad: "Applying 'KIS,S' Principles to Datavis in R" 52 | Good: "'Keep It Simple, Stupid' for Data Visualization in R" 53 | 54 | ## For related courses, use "Advanced" prefix 55 | 56 | For series of more than two related courses, it's best to have descriptive names to distinguish them. Failing that, you can also distinguish them by calling the second course "Intermediate" or "Advanced". 57 | 58 | Note that the previous convention of numbering courses with a `(Part i)` suffix is deprecated – tracks are used to indicate relative position. 59 | 60 | Bad: "Junior Working with Web Data in bash", "Sophomore Working with Web Data in bash", and "Senior Working with Web Data in bash" 61 | Good: "Working with Web Data in bash: Accessing APIs", "Working with Web Data in bash: Scraping Web Pages", and "Working with Web Data in bash: Sharing Your Datasets" 62 | 63 | -------------------------------------------------------------------------------- /docs/courses/design/overview-prerequisites.md: -------------------------------------------------------------------------------- 1 | # Step 5.3 - What are the prerequisites? 2 | 3 | Write a list of other courses that should be considered prerequisites for this course. 4 | 5 | ## Examples 6 | 7 | From a course on clinical trials analysis. This suggests that students need basic R programming skills, basic statistical skills, and basic exploratory data analysis skills. 8 | 9 | - [Introduction to R](https://www.datacamp.com/courses/free-introduction-to-r) 10 | - [Introduction to Data](https://www.datacamp.com/courses/introduction-to-data) 11 | - [Exploratory Data Analysis](https://www.datacamp.com/courses/exploratory-data-analysis) 12 | 13 | 14 | From a course on XGBoost. This makes it clear that the course follows on from the scikit-learn course. 15 | 16 | - [Intro to Python for Data Science](https://www.datacamp.com/courses/intro-to-python-for-data-science) 17 | - [Intermediate Python for Data Science](https://www.datacamp.com/courses/intermediate-python-for-data-science) 18 | - [Supervised Learning with scikit-learn](https://www.datacamp.com/courses/supervised-learning-with-scikit-learn) 19 | 20 | ## FAQs 21 | 22 | ### How many prerequisites do I need? 23 | 24 | You need enough prerequisites to deter unqualified students from starting your course, but not too many that you deter qualified students from starting. In practice, two or three prerequisites is usually appropriate. 25 | 26 | ### I have some plotting exercises in my course. Do I need a plotting course as a prerequisite? 27 | 28 | Usually no. In the first exercise where the student draws a plot, keep it simple, explain things gently, and link to an appropriate plotting course. If the course makes heavy use of plotting throughout, you may wish to consider having a plotting course as a prerequisite. Discuss this with your Curriculum Lead. 29 | 30 | 31 | ## Good ideas 32 | 33 | ### Browse the DataCamp course library 34 | 35 | It can be useful to see which courses already exist on DataCamp. [Browse the library](https://www.datacamp.com/courses) and see if anything looks like a suitable prerequisite. 36 | 37 | ### Think about different axes of skills 38 | 39 | Are there any data manipulation prerequisites? Any statistical prerequisites? Any machine learning prerequisites? Any programming prerequisites? Any problem-domain prerequisites? 40 | 41 | 42 | ## Common problems and their solutions 43 | 44 | ### Not enough prerequisites 45 | 46 | If you don't have enough prerequisites, then students without enough background experience will take your course, and are likely to give it low ratings. Be honest about what you are assuming of the students who your course. 47 | 48 | ### Too many prerequisites 49 | 50 | If you have too many prerequisites, then students will be put off taking your course, and you will get less money. It's OK to be thorough about listing prerequisites, but discuss them with your Curriculum Lead, and they will likely be cut down to the best three. 51 | 52 | 53 | ## How will this be reviewed? 54 | 55 | This step will be reviewed by at least two people other than your Curriculum Lead, possibly including an external reviewer. They will look for the following points. 56 | 57 | - Are there a sensible number of prerequisites? 58 | - Do the students really need to take those courses before this one? 59 | - Are there any other courses not listed that would make better prerequisites? 60 | 61 | -------------------------------------------------------------------------------- /docs/courses/guidelines/style.md: -------------------------------------------------------------------------------- 1 | # Course Style 2 | 3 | Please follow DataCamp's style guidelines, to help create a consistent look and feel for students. 4 | 5 | ## Text 6 | 7 | ### Use American English 8 | 9 | The USA contains our largest group of students. 10 | 11 | Good: This standardizes the modeling of colors. 12 | Bad: This standardises the modelling of colours. 13 | 14 | ### Use "you" rather than "we" 15 | 16 | You should be consistent about the pronoun. DataCamp has standardized on "you" in order to empower students. 17 | 18 | Good: You are going to run a regression model. 19 | Bad: We are going to run a regression model. 20 | 21 | ### Use parentheses after function/method names 22 | 23 | It helps to distinguish from variable names. 24 | 25 | Good: Call the `mean()` function. 26 | Bad: Call the `mean` function. 27 | 28 | ### Format package names as code 29 | 30 | Likewise modules and libraries (depending upon the technology being used). 31 | 32 | Good: The Python package `pandas` produces pretty plots. 33 | Bad: The Python package *pandas* produces pretty plots. 34 | 35 | ## Code 36 | 37 | Follow these standard style guides, unless you have a really good reason not to. 38 | 39 | - R: [The tidyverse style guide](http://style.tidyverse.org) 40 | - Python: [PEP 8](https://www.python.org/dev/peps/pep-0008) 41 | - SQL: [Holywell's SQL Style guide](https://www.sqlstyle.guide) 42 | - Shell: [Shell Style Guide](https://google.github.io/styleguide/shell.xml) 43 | - C++ (for `rcpp`): [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) 44 | 45 | See also [Writing NormalExercise code](/courses/exercises/normal-exercises/code.html). 46 | 47 | ## Code comments 48 | 49 | ### Start each comment on a new line 50 | 51 | Good: 52 | 53 | ~~~~~ 54 | # Calculate the sum of x 55 | y <- sum(x) 56 | ~~~~~ 57 | 58 | Bad: 59 | 60 | ~~~~~ 61 | y <- sum(x) # Calculate the sum of x 62 | ~~~~~ 63 | 64 | 65 | 66 | ### Add a single space after the comment char 67 | 68 | 69 | Good: 70 | 71 | ~~~~~ 72 | # Calculate the sum of x 73 | y <- sum(x) 74 | ~~~~~ 75 | 76 | Bad: 77 | 78 | ~~~~~ 79 | #Calculate the sum of x 80 | y <- sum(x) 81 | ~~~~~ 82 | 83 | ### Capitalize the first letter of every comment 84 | 85 | Good: 86 | 87 | ~~~~~ 88 | # Calculate the sum of x 89 | y <- sum(x) 90 | ~~~~~ 91 | 92 | Bad: 93 | 94 | ~~~~~ 95 | # calculate the sum of x 96 | y <- sum(x) 97 | ~~~~~ 98 | 99 | ### If you have one sentence, no `.` is required 100 | 101 | Good: 102 | 103 | ~~~~~ 104 | # Calculate the sum of x 105 | y <- sum(x) 106 | ~~~~~ 107 | 108 | Bad: 109 | 110 | ~~~~~ 111 | # Calculate the sum of x. 112 | y <- sum(x) 113 | ~~~~~ 114 | 115 | 116 | ### If you have multiple sentences in your comment, end each with a period 117 | 118 | Good: 119 | 120 | ~~~~~ 121 | # Calculate the sum of x. Assign the result to y. 122 | y <- sum(x) 123 | ~~~~~ 124 | 125 | Bad: 126 | 127 | ~~~~~ 128 | # Calculate the sum of x. Assign the result to y 129 | y <- sum(x) 130 | ~~~~~ 131 | 132 | ### Don't use backticks or quotes to refer to variables or functions inside comments 133 | 134 | Good: 135 | 136 | ~~~~~ 137 | # Calculate the sum of x 138 | y <- sum(x) 139 | ~~~~~ 140 | 141 | Bad: 142 | 143 | ~~~~~ 144 | # Calculate the sum of `x` 145 | y <- sum(x) 146 | ~~~~~ 147 | 148 | 149 | -------------------------------------------------------------------------------- /docs/courses/design/choose-learner-personas.md: -------------------------------------------------------------------------------- 1 | # Step 2 - Who Is This Course for? 2 | 3 | Read the page of [sample learner personas](/courses/design/personas.html) and choose 1 or 2 of them as the most likely to benefit from your course. Write a sentence about the ones you chose stating how good a fit you think they might be. In brief, the five personas are: 4 | 5 | - Unaware Umberto: is new to statistics, programming, and the domain he's working in. 6 | - Starting Sindhu: has domain expertise, but not as much programming or statistics. 7 | - Coder Chen: is a strong programmer, but lacks domain expertise and statistical background. 8 | - Mathematical Marta: strong mathematical and statistical background, a little programming, completely new to the domain. 9 | - Advanced Alex: has all three kinds of knowledge. 10 | 11 | Note: the [full description of these personas](/courses/design/personas.html) mention specific technologies or domains, 12 | such as Python or epidemiology. 13 | When using these personas, 14 | replace these by equivalent levels of knowledge about technologies or domains appropriate to your course, 15 | e.g., 16 | novice understanding of R but advanced understanding of medical imaging. 17 | 18 | ## Examples 19 | 20 | 1. The author of an introductory course on data visualization with Python chose Marta, Sindhu, and Umberto as her audience. Her reasoning is that Chen and Alex (who are both strong programmers) will be able to pick up the programming on their own without a course, but the other three all need a course to show them how code can create pictures. 21 | 22 | 2. The author of a course on RNA-Seq analysis decided that her target audience included people who know biology but are lacking R and/or statistics. She therefore picked Sindhu as the main learner persona for her course, and Alex as an additional persona. 23 | 24 | ## FAQs 25 | 26 | ### Can I choose more than 2 personas? 27 | 28 | You can comment on how good a fit the other personas would be for your course, but if your course seems like it would be suitable for everyone, that's an indication of a problem. It is important to think about targeting your course towards a specific demographic. You cannot easily please beginners and experts in a topic. 29 | 30 | ### Can I invent my own personas? 31 | 32 | If necessary, but please discuss with your Curriculum Lead first to decide whether or not it constitutes a realistic DataCamp student. 33 | 34 | ## Good ideas 35 | 36 | ### Think about different axes of expertise 37 | 38 | To complete a course, the students need programming skills, statistics skills, and domain-specific knowledge, and the levels of each may be different within your course. Your course may require beginner-level programming skills but advanced statistical skills and intermediate domain knowledge, for example. It can be useful to think about how the sample learner personas match up to your course on each of these axes. 39 | 40 | 41 | ## Common problems and their solutions 42 | 43 | ### Overestimating students' mathematical skills 44 | 45 | Many DataCamp students do not have a university-level mathematical background. That means that you cannot assume that the majority of students will be able to understand equations. 46 | 47 | 48 | ## How will this be reviewed? 49 | 50 | Your Curriculum Lead will discuss your responses to the persona questions. They will not be formally reviewed (though they provide important context for reviewers). 51 | -------------------------------------------------------------------------------- /docs/challenges/content/output-challenge.md: -------------------------------------------------------------------------------- 1 | # Output Challenge 2 | 3 | In an `OutputChallenge`, a student has to match code with the corresponding output, or match output with the corresponding code. 4 | 5 | ![Output Challenge](images/OutputChallenge1.png) 6 | 7 | ## Authoring 8 | 9 | Every `OutputChallenge` starts with a title (optional) and metadata. 10 | 11 | ## Functions 12 | 13 | ```yaml 14 | type: OutputChallenge 15 | ``` 16 | 17 | ### Code 18 | 19 | The code block provides a template to generate options for a challenge. It contains references to the variables with `{{ }}` notation. 20 | For example, the code template below uses for variables `var1`, `var2` and `fun1`, whose values are dynamically generated based on the values specified in the variables block. 21 | 22 | `@code` 23 | 24 | ```{r} 25 | x <- {{var1}} 26 | y <- {{var2}} 27 | {{fun1}}(x, y) 28 | ``` 29 | 30 | #### Anchoring 31 | 32 | To limit the variability between the different options that are generated, it's possible to 'anchor' certain variables. Have a look at this example: 33 | 34 | `@code` 35 | 36 | ```{r} 37 | x <- {{$var1}} 38 | y <- {{$var2}} 39 | {{fun1}}(x, y) 40 | ``` 41 | 42 | By prepending `var1` and `var2` with `$`, we're slightly changing the way the four code-to-output or output-to-code options are generated. Instead of randomly selecting a value for `var1`, `var2` and `fun1` for each option, a value for `var1` and `var2` will only be chosen once. All the options that are generated will now use the same var1-var2 combination, and only fun1 will be varied for the different options. 43 | 44 | This will typically be useful if you're working with data variables, and you don't want the different options to contain very different dummy data to start from. With anchoring, you prevent the options from being too different, but there's still a high degree of randomization, because the anchored variables are still randomly chosen in the first stage. 45 | 46 | #### Multiple Code Blocks 47 | 48 | In some cases, you might want to specify several code templates. In this case, for the generation of each option, the backend will first randomly select one of the two templates, and next randomly fill it in based on the provided options for the variables. It's therefore perfectly possible that 2 out of four generated options come from the first template, and the other two come from the second template. 49 | 50 | `@code` 51 | 52 | `@code1` 53 | ```{r} 54 | x <- {{var1}} 55 | y <- {{var2}} 56 | {{fun1}}(x, y) 57 | ``` 58 | 59 | `@code2` 60 | ```{r} 61 | x <- {{var1}} 62 | y <- {{var2}} 63 | z <- {{var3}} 64 | {{fun1}}(x, y, z) 65 | ``` 66 | 67 | #### Complete example 68 | 69 | Here is the complete `OutputChallenge` example: 70 | 71 | ## Functions 72 | 73 | ```yaml 74 | type: OutputChallenge 75 | ``` 76 | 77 | `@code` 78 | 79 | ```{r} 80 | x <- {{var1}} 81 | y <- {{var2}} 82 | {{fun1}}(x, y) 83 | ``` 84 | 85 | `@variables` 86 | 87 | ```{yaml} 88 | var1: 89 | - 'list(p = c(3, 9))' 90 | - 'list(q = c(8, 4))' 91 | - 'list(r = c(2, 6))' 92 | var2: 93 | - 'c(3, 4)' 94 | - 'c(1, 2)' 95 | - 'c(7, 5)' 96 | - 'c(8, 6)' 97 | fun1: 98 | - 'c' 99 | - 'list' 100 | ``` -------------------------------------------------------------------------------- /docs/courses/exercises/examples/ipynb/r/NormalExercise.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "tags": [ 7 | "type:NormalExercise", 8 | "xp:100", 9 | "skills:1", 10 | "key:15d729634a" 11 | ] 12 | }, 13 | "source": [ 14 | "## How it works\n", 15 | "\n", 16 | "You can execute R commands straight in the console. This is a good way to experiment with R code, as your submission is not checked for correctness.\n", 17 | "\n" 18 | ] 19 | }, 20 | { 21 | "cell_type": "markdown", 22 | "metadata": { 23 | "tags": [ 24 | "@instructions" 25 | ] 26 | }, 27 | "source": [ 28 | "- In the editor on the right there is already some sample code. Can you see which lines are actual R code and which are comments?\n", 29 | "- Add a line of code that calculates the sum of 6 and 12, and hit the 'Submit Answer' button." 30 | ] 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "metadata": { 35 | "tags": [ 36 | "@hint" 37 | ] 38 | }, 39 | "source": [ 40 | "Just add a line of R code that calculates the sum of 6 and 12, just like the example in the sample code!" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": null, 46 | "metadata": { 47 | "collapsed": true, 48 | "tags": [ 49 | "@pre_exercise_code" 50 | ] 51 | }, 52 | "outputs": [], 53 | "source": [ 54 | "# no pec" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": null, 60 | "metadata": { 61 | "tags": [ 62 | "@sample_code" 63 | ] 64 | }, 65 | "outputs": [], 66 | "source": [ 67 | "# Calculate 3 + 4\n", 68 | "3 + 4\n", 69 | "\n", 70 | "# Calculate 6 + 12" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": null, 76 | "metadata": { 77 | "tags": [ 78 | "@solution" 79 | ] 80 | }, 81 | "outputs": [], 82 | "source": [ 83 | "# Calculate 3 + 4\n", 84 | "3 + 4\n", 85 | "\n", 86 | "# Calculate 6 + 12\n", 87 | "6 + 12" 88 | ] 89 | }, 90 | { 91 | "cell_type": "code", 92 | "execution_count": null, 93 | "metadata": { 94 | "collapsed": true, 95 | "tags": [ 96 | "@sct" 97 | ] 98 | }, 99 | "outputs": [], 100 | "source": [ 101 | "test_output_contains(\"18\", incorrect_msg = \"Make sure to add `6 + 12` on a new line. Do not start the line with a `#`, otherwise your R code is not executed!\")\n", 102 | "success_msg(\"Awesome! See how the console shows the result of the R code you submitted? Now that you're familiar with the interface, let's get down to R business!\")" 103 | ] 104 | } 105 | ], 106 | "metadata": { 107 | "celltoolbar": "Tags", 108 | "datacamp-chapter": { 109 | "description": "In this chapter, you will take your first steps with R.", 110 | "title": "Intro to basics", 111 | "title_meta": "Chapter 1" 112 | }, 113 | "kernelspec": { 114 | "display_name": "R", 115 | "language": "R", 116 | "name": "ir" 117 | }, 118 | "language_info": { 119 | "codemirror_mode": "r", 120 | "file_extension": ".r", 121 | "mimetype": "text/x-r-source", 122 | "name": "R", 123 | "pygments_lexer": "r", 124 | "version": "3.4.1" 125 | } 126 | }, 127 | "nbformat": 4, 128 | "nbformat_minor": 2 129 | } 130 | -------------------------------------------------------------------------------- /docs/contract.md: -------------------------------------------------------------------------------- 1 | # Our Contract 2 | 3 | DataCamp has a [standard contract](./datacamp-example-contract.pdf) for all of its premium courses, 4 | which we think is one of the best in the industry. 5 | Its terms are outlined in plain language below; 6 | please see [the sample contract](./datacamp-example-contract.pdf) for the legally-binding wording. 7 | 8 | We recognize that expectations for contractual terms may vary based on jurisdiction and personal background, 9 | but given the diversity among our instructors, 10 | we aren't able to make case-by-case changes in most cases. 11 | The major exception is if you need disclaimers added because you are a government employee 12 | doing this work on your own time; 13 | if you are in that situation or a similar one, 14 | we'd be happy to talk about ways and means. 15 | 16 | DataCamp's contract with authors is broken into two parts to simplify future agreements: 17 | a *master agreement* governing our relationship, 18 | which you only need to sign once, 19 | and a *content exhibit* with project-specific details. 20 | The latter is a shorter document, 21 | and you will need to sign one copy for each course, project, or other piece of work you do with us 22 | (not least because it includes delivery dates). 23 | 24 | The contract's key features are: 25 | 26 | - You grant us a perpetual non-exclusive license to use the material that you develop for us. 27 | The "non-exclusive" part means that you can use the material elsewhere, 28 | e.g., in other courses or workshops. 29 | However, if you provide it through another online course platform, 30 | your revenue share from DataCamp may be reduced. 31 | 32 | - We pay you an advance upon delivery of the course, 33 | and then pay a royalty each quarter based on how many people complete the course. 34 | once the advance has been fully paid out. 35 | We're happy to talk one-to-one about the amounts, 36 | and paying for course completions helps maintain a focus on course quality and engagement. 37 | 38 | - The contract defines a timeline for delivering materials 39 | (typically six months for a full course, and less for projects and other kinds of content). 40 | We are happy to negotiate extensions if real life gets in the way, 41 | but if it appears that your other commitments aren't going to let you complete work in a timely fashion, 42 | or if the quality of what you deliver doesn't meet our standards 43 | even after we have given you feedback and a chance to make corrections, 44 | we may give notice that we are terminating the contract. 45 | 46 | - We're allowed to make reasonable changes to the material, 47 | but we need your approval for anything major. 48 | If the final result doesn't meet our standards for quality, 49 | or if we decide not to use the material for any other reason, 50 | we will let you know why; 51 | if you choose not to make the fixes we ask for, 52 | we shake hands and go our separate ways. 53 | 54 | - After the course has launched, 55 | we may ask you for updates. 56 | If you agree to make them, 57 | the work is covered by the pre-existing contract. 58 | If not, 59 | we can bring in someone else to do the updates 60 | and split the revenue between you and them according to the proportion of work done. 61 | 62 | - Liability is limited in both directions 63 | with an exception in the case of infringement of intellectual property rights. 64 | We take IP rights seriously and we expect the same from course instructors we collaborate with. 65 | -------------------------------------------------------------------------------- /docs/courses/exercises/video-exercises/scripts.md: -------------------------------------------------------------------------------- 1 | # Writing `VideoExercise` Scripts 2 | 3 | This page provides guidance on writing good video scripts. 4 | 5 | ## Examples 6 | 7 | From [Putting stringr together](https://campus.datacamp.com/courses/string-manipulation-in-r-with-stringr/string-basics?ex=9) in "String Manipulation in R with stringr". This gradually builds up code to generate the lyrics to the song "Old MacDonald had a farm". The novelty value (including a singing instructor) and use of pop culture make it highly memorable. The way that a complex output is generated from repeated use of a single, simple function is also rather powerful. 8 | 9 | From [Tidying Shakespearean Plays](https://campus.datacamp.com/courses/sentiment-analysis-in-r-the-tidy-way/shakespeare-gets-sentimental?ex=1) in "Sentiment Analysis: The Tidy Way". This has an attention seeking opener (quoting Shakespeare; that dress) to get students engaged. 10 | 11 | From [What is code profiling](https://campus.datacamp.com/courses/writing-efficient-r-code/diagnosing-problems-code-profiling?ex=1) in "Writing Efficient R Code". As well as having the instructor dressed up to match the dataset being discussed, this also makes good use of images and screenshots. 12 | 13 | ## FAQs 14 | 15 | ### How long should the script be? 16 | 17 | 300 to 400 words is best, and there is an upper limit of 600 words. Most people speak at around 100 to 120 words per minute. 18 | 19 | ## Good ideas 20 | 21 | ### Provide motivation 22 | 23 | In the rush to cut down the number of words, you may be tempted to stick to plain facts. This risk is that you end up with a really boring video. Try to save some space to provide motivation for what problem you are trying to solve. 24 | 25 | ### Tell a story 26 | 27 | People are evolutionarily wired to remember stories. They are also more fun to listen to than plain facts. Try to work a narrative into the script. 28 | 29 | ### Use the ADEPT pattern 30 | 31 | [ADEPT](https://betterexplained.com/articles/adept-method) is a useful pattern for structuring explanations of technical concepts. The steps are as follows. 32 | 33 | 1. Use an **A**nalogy. 34 | 1. Draw a **D**iagram. 35 | 1. Provide a concrete **E**xample. 36 | 1. Describe it in **P**lain English. 37 | 1. Provide a **T**echnical definition. 38 | 39 | ## Common problems and their solutions 40 | 41 | ### Too many tongue twisters 42 | 43 | You have to speak the script out loud, all the way through, preferably in one or two takes. For your own sake, try to limit the number of words with seven syllables. 44 | 45 | ### Explaining everything 46 | 47 | Unlike the coding and multiple choice exercises that students can take at their own pace, video exercises run at a fixed speed, so they have to be understandable in real-time. (You can't assume that students will watch videos multiple times.) This means that they need to be kept fairly simple. 48 | 49 | ### Being too formal 50 | 51 | When you write the script, it is easy to slip into a "technical writing voice" that is more formal than your spoken voice. Then when you come to say the words out loud, it can come across as unnatural. Try saying your script out loud to another person (or rubber duck, if no-one is available). 52 | 53 | ### Using local phrases without explanation 54 | 55 | If you are a native English speaker, you need to bear in mind that the DataCamp audience is international, and that many students will not understand slang phrases or idioms without explanation. If you want to say "red herring", you need to explain that term. 56 | 57 | --------------------------------------------------------------------------------