freeCodeCamp/python-coding-challenges

Curriculum Outline

Ethan-Arrowood opened this issue Β· 61 comments

Curriculum Outline

In the root directory of the project there will exist a directory: challenges, and a file called classroom_settings.json

The challenges directory will contain each lesson directory title like so: [C#].[L#].<name> i.e. 2.1.Addition (means the Addition lesson is Lesson 1 of Chapter 2).
Due note that chapter and lesson numbers is for our organization purposes and will not be reflected in the Repl.it Classroom.

Each lesson directory will contain four files:

  1. lesson_code.py
  2. lesson_tests.py
  3. lesson.md
  4. lesson_settings.json

lesson_code.py will be loaded into the initial-code section (top left container) of the classroom.

lesson_tests.py will be loaded into a hidden unittest file (behind the scenes).

lesson.md will be loaded into the markdown section (bottom right container) of the classroom.

lesson_settings.json will be used to store information such as Title, Chapter, Lesson number, ID(?). This will mainly be for FCC, but repl will be able to utilize the Title property and maybe the ID property.

Each Repl.it Classroom lesson url will be added to the challenges.json file in the project root directory.


[Down The Road] - implement a python script that auto builds the challenges.json file
The current structure for the FCC Python Curriculum is: Beginner Section, Intermediate Section, & Special Topic Section.

Beginner Section:

  • Introduction to Python
  • Output
    • Print
    • Escape Characters
    • input
  • Data Types
    • Integers, Floats
    • Strings
    • Tuples
    • Lists
    • Sets
    • Dictionaries
  • Operators - bgroveben
    • +,-, *, /, %, **
    • <, >, <=, >=, ==, !=
    • =
    • True, False, and, or, not
    • in, not in
    • is, is not
  • Math - bgroveben
    • Add, Subtract, Multiply, Divide
    • Power, sqrt(), abs(), round(), sum(), max(), min()
  • Variables
  • Conditionals
    • if, elif, else
  • Loops
    • while, for (in range), for (in list), for (in string)
  • Functions
  • Classes

Intermediate Section:

  • File I/O
  • Iterators & Generators
  • Lambda - robbiemu
  • Conditionals
  • OOP
  • Modules, Libraries, Packages
  • File and Error Handling
  • Advanced Objects and DataTypes
  • Print Formatting
  • List Comprehensions
  • Decorators

Special Topic Section:

  • Machine Learning
  • Game Development
  • Webscraping (BeautifulSoup)
  • GIS (Leaflet/Folium)
  • Flask/Django (better to focus on one not both)
  • Data Analysis (Panda/Numpy)
  • Data Visualization (brokeh)
  • GUI (tkinter)
  • Geocoding (geopy)
  • Natural Language Toolkit (NLTK)

In the root directory of the project there will exist a directory: challenges.
Inside will contain each lesson directory titled as so: [lesson title]_C[chapter#]_L[lesson#]

For example: Addition_C2_L1<- This means the Addition lesson is Lesson 1 of Chapter 2

Each lesson directory will contain four files:

  1. lesson_code.py
  2. lesson_tests.py
  3. lesson.md
  4. lesson_settings.json

lesson_code.py will be loaded into the initial-code section (top left container) of the classroom.

lesson_tests.py will be loaded into a hidden unittest file (behind the scenes).

lesson.md will be loaded into the markdown section (bottom right container) of the classroom.

lesson_settings.json will be used to store information such as Title, Chapter, Lesson number, ID(?). This will mainly be for FCC, but repl will be able to utilize the Title property and maybe the ID property.

Here is an EXAMPLE layout:
screen shot 2017-05-10 at 11 25 32 pm

*Special Note - the challenges.json file will be used to track user progress via localStorage. May be worth writing a py script to build this automatically based on the challenges directory using the lesson_settings.json file inside each lesson directory. [Down the road feature?]

@bgroveben @QuincyLarson @ginoskotheon Can I get some feedback on the previous comment before I send it to Amjad?

This looks good! One question: how do you see the Chapter mapping on the Repl.it's taxonomy? Would it be the Classroom? Alternatively, it doesn't have to map to anything and we just prefix the assignment name with the chapter.

@amasad I don't think it needs to map to anything on Repl.it's taxonomy (unless you plan on implementing chapters into classrooms in the future πŸ˜‰). For the moment it'll just keep things more organized on our end.

Yeah we might add chapters, some users asked for it, but for now we'll just leave it out. Are you ok with having the titles (directory names) have spaces and special characters? I'm fine with it, it just might make it harder for the authors.

Some other thoughts:

  1. We can use book-like format since people should be already familiar with [C#].[L#].<name> e.g. 2.1.Addition
  2. I think we'll need a top-level json settings for Repl.it to specify things like the classroom name, language, and if you want students to finish a lesson to unlock the one after etc.

We can use book-like format since people should be already familiar with [C#].[L#]. e.g. 2.1.Addition

Yes! I like this layout a lot. What would we do if the name is multiple words? i.e. Logic Operators
Would it be: 1.5.LogicOperators or 1.5.Logic_Operators or (something else entirely).
Directories can have special characters and underscores, but no spaces (keeps scripting easier).

I think we'll need a top-level json settings for Repl.it to specify things like the classroom name, language, and if you want students to finish a lesson to unlock the one after etc.

Would you like me to add a classroom_settings.json file in the challenges directory?

I think underscores for spaces might work best.
classroom_settings.json works well.

sounds good to me. I'll start implementing this structure tomorrow πŸ‘

@Ethan-Arrowood @amasad I like the layout and the naming conventions -- looks good!

@Ethan-Arrowood We may want to update the gulpfile to watch for changes to the *.py, *.json, and *.md files we're writing for the lessons.

Okay challenge directory has been pushed to master. Lets start writing challenges directly in the appropriate directories. Also, feel free to reorganize things as you see best fit I just pre filled it so there was some sort of structure present.

@Ethan-Arrowood Looks great. I'll start trying to get some challenges going.

Outstanding @Ethan-Arrowood ! I have written some of the lessons included in your challenges directory (as well as a few others); you can preview them in this Repl.it Classroom. I just need to make sure that the file and directory structure is consistent, update the tests, and see that everything works. Great job and thanks again!

@bgroveben thank you πŸ˜„ when you're able to move your challenges over make a pr against master and I'll merge it πŸ‘

@bgroveben your course looks awesome! I hope the authoring experience on Repl.it was good. (I don't want to take this thread on a tangent but if you have any feedback for us we're at contact@repl.it).

Hey all, meet @vpavlenko he's an engineer at Repl.it and will be working on implementing this Repl.it Classroom / Github integration.

Hey guys, I'm going to implement everything necessary inside Repl.it. @bgroveben It would be super helpful if you could upload any single challenge to this repo soon, so I could have a real example as a reference. Happy to work with you all :)

@vpavlenko I'll be able to get one or two up if @bgroveben is busy.

Greetings @amasad @Ethan-Arrowood @vpavlenko ! Thank you for the kudos on the lessons I've made so far. I just have to fix a few more of the tests, and I'll be ready to submit a PR for the beginner/math challenges this morning. Please contact me if there is anything else I can do for you.

I just submitted a PR for 14 beginner/math challenges that can be found in Chapter 4.1 through 4.E (I ran out of base ten digits, so I moved up to hexadecimal). Please feel free to review, revise, and so forth. I'm going to be working on a PR for beginner/operators next. Cheers!

@amasad @vpavlenko Many Thanks and Cheers to you and the rest of the folks at Repl.it for helping us out with this project! You are all extra-special awe-sum. BTW I really like the new Classrooms you have been working on. I'm still learning my way around, but if I have any suggestions I'll contact you. Great Job!

@bgroveben great work on the challenges. I went ahead and merged them in. For future PR's try to ref at least 1 issue just so we can track commits. We will have to be more strict about that in the future once we 'go live'.

Next step: auto building the challenges.json file. Any ideas on how we can do that? We may need to wait for Repl.It Github/Classroom integration so we can retrieve the links for each challenge. I'm thinking we use some sort of Node.JS FileSystem script to read the challenges directory and write certain data to the challenges.json file.

@bgroveben Thanks a lot for the PR.

I wonder if you're going to store model solutions in the repo or somewhere else as well?

@vpavlenko I don't think we are currently planning on providing model solutions; however, that may be a useful feature so if you can set it up, we will probably be able to use it down the road.

@Ethan-Arrowood I'm asking because in @bgroveben 's Repl.it classroom every assignment already has a model solution added. However, I don't see it in the PR #17 .

Another question: what is gonna be the source of truth for Assignment ID - the ID in lesson_settings.json or the directory name in the repo? Consider the following scenario: you pushed changes to assignment statement and you want to update your existing classroom backed by Github Repo based on the newest repo version. Then we need to understand which assignment from the repo belongs to which assignment in the Repl.it classroom.

@vpavlenko I do not know whats going to power the Assignment ID. I was thinking about just using the chapter and lesson title something like:

For the Addition lesson in the Math chapter, the ID for Addition would be = math_addition.

Will this be sufficient? Or do we need to implement something different?

@vpavlenko just spoke to Quincy about the ID stuff. I'm going to use MongoDB objectid() method to generate ids. Will have to be done manually for each new challenge.

I'm trying to scope the initial implementation of the integration and I'm feeling like I lack some context. Could you please describe how do you plan to use Github and Repl.it Classroom integration? I'd like to understand what kind of use cases do you have in mind.

For instance, pretend that there's no integration implemented. Why it's not sufficient for FreeCodeCamp to have the assignments in the Repl.it interface? Are you gonna be using Github for just a backup option or for something else?

If you plan to collaborate when designing assignments, are you going to use edit files on Github first and use Github PRs or are you gonna share the same Repl.it account to do it on our platform? Pretend that we sync a single assignment existing both in Github and in the classroom, then what wins - a Github content for it, a Repl.it content, last write (last timestamp), or the direction of synchronization is manually picked every time?

Model solutions that we have help content creators to verify they configure unit tests properly. Do you plan to store them on Repl.it side only or ignore the entire feature altogether? I'm asking because @bgroveben already used it for all assignments.

Are you going to have input/output tests for some problems, or only unit tests all the time? Are you going to use "project mode" - several files of template per assignment?

@Ethan-Arrowood Thanks for reminding me to include the issue number in my PR's. When I submit more lessons/challenges, I think #2 is most appropriate.

@vpavlenko @Ethan-Arrowood These are all excellent points; thank you for bringing them up.

So far I have been drafting and refining the lessons using the Github integration, and then implementing the lessons using Repl.it. Basically, I have written all of the lessons and challenges so that they will work in both environments. However, as @vpavlenko pointed out, we are going to have to deal with the complications that come with using both Github and Repl.it. For the MVP, I like the idea of hosting the lessons on Repl.it using a shared account and keeping the Github code as a backup (and testing/sandbox) environment, but I am very flexible on that.

I have written model solutions for the lessons (here is my challenge 'recipe'), but I haven't included them in the Github files because I'm not quite sure if we will be using them or where to put them if we do. The Repl.it Classrooms already have a section that accommodates a model solution, so it was easy to just paste one in after writing the tests. I like the idea of using model solutions that will be revealed after the user has implemented their own solution that passes the tests (which Repl.it does); if we choose to do things that way, we just need to work out how we will implement the solutions for the Github code.

As for the tests, unit tests are okay for the MVP and for the beginner level challenges that I have written so far, but there is definitely room for improvement. As the lessons and challenges become more complex, there will be a need for more comprehensive testing, including (but not limited to) input/output tests (which are a great idea... thanks @vpavlenko!). My testing skills need upgrading anyway, so any help on that is appreciated.

The other issues you have brought up are beyond the scope of my engineering skills (for now at least). I'm probably most useful to you as the dev who can write Python lessons and code challenges. If there is anything else I can do to help move this project along and make it work better, please let me know and I'll do my best.

@vpavlenko

Are you going to use "project mode" - several files of template per assignment?

I haven't used project mode in my lessons yet, but I believe that we will reach a point where having multiple files in a challenge will be useful.

@vpavlenko

Why we want GitHub integration:
We will have one FreeCodeCamp repl.it account. It will have a classroom essentially linked to the challenge directory in the GitHub master branch of the python-curriculum repo. When we submit new challenges or update existing ones via GitHub repo, Repl.it will automatically updated the appropriate challenge (or create a new one). This is why we will have 'ID's for each challenge so they can stay synced up.

I'm traveling today so I won't be available to answer questions until later this evening (approx. 8hrs from now). Quincy and William can also answer questions about this so feel free to reach out to them if you need a answer.

@vpavlenko

To expand on what @Ethan-Arrowood said:
FreeCodeCamp is powered by volenteers and contributers that primarily use GitHub. If someone found a bug in one of the lessons fixing it should be as easy as sending a pull request. Furthermore forking should also be possible if folks want to use at as a basis for another language or their own course (although not necessary for the first milestone).

IMO two-way syncing is not needed (at least initially). When a classroom is imported from GitHub then the repo becomes the source of truth and ideally we would make it read-only from Repl.it. The only deviation from this might be model solutions since putting them in the repo makes cheating too easy (and I do think model solutions are important for learning).

FCC folks what is your stance on cheating? (At Repl.it we do some work to try to prevent or at least make it harder).

FCC works on an honor system. Basically if a user wants to cheat, they can, but the only person they are hurting is themselves. Model solutions can be optional if that's makes things easier.

@bgroveben @ginoskotheon @QuincyLarson @vpavlenko @amasad I made some important changes to the challenges directory as well as the lesson_settigns.json file and the challenges.json file. Please take a moment and read my PR descriptions #18 #19 so you know what has changed.

Tomorrow, I'll be cleaning up some file names and hopefully refining the challenge.json build method, but I've pushed a majority of the changes in #18 & #19

Please give me feedback and ask any questions you have; I'll do my best to clear up anything thats misunderstood πŸ˜„

We're making good progress on this. I wanted to let you know that @turbio is taking this over from the @replit side.

Hey πŸ‘‹ @Ethan-Arrowood @bgroveben, as @vpavlenko said I'll be taking over Repl.it's github classrooms from here on out. I'll keep you guys posted with our progress. Also, what is FCC's username on Repl.it, that way I can give you guys early access.

Greetings @Ethan-Arrowood , I'm ready to begin putting all of the lessons for the beginner/operators lessons up.
However, before I submit a PR, we need to include an Operators chapter in the challenges.json file (right at the beginning) or else the node generate-challenge-json.js command will throw an error.
I can tinker with the code myself, but you know it better than I do and I don't want to break anything you have written 😱
Please advise and thank you for your help.

@bgroveben go ahead and edit the chapter array in challenges.json as you see fit. That array is only being used to generate the map; not anything in the generate file (yet).

Welcome @turbio! Glad to have you on board. I'll reach out to @QuincyLarson for FCC's Repl.it username and get back to you asap πŸ‘

@vladdoster & @bgroveben - just realized you guys are both working on the same challenges. Take a minute to review each others work. I'd recommend one of you opening a PR and discussing changes in that and editing your code accordingly. Let me know if you need any help!

@turbio team@freecodecamp.com for the email address - username is probably freecodecamp πŸ‘

@bgroveben how's the challenges coming along? Do you need any help?

@Ethan-Arrowood my beloved day job has eaten up most of my free time over the past few days, but I'll have a chance to update the chapter array and submit a PR for the operators challenges on (hopefully) Wednesday or (more likely) Thursday. Good looking out and thanks for offering your assistance!

Great job @bgroveben πŸ‘

I'm working on Chapter 2 now (Data Types)

@turbio how is it going over on Repl.It? Anything more you need from us?

@Ethan-Arrowood Everything's going smoothly on the Repl.It front, we'll hopefully have something you can try out by next week.

@Ethan-Arrowood hey there! I can probably try to take up the machine learning parts of this. I'm trying to put together some notes on machine learning and I think using Python would be a great way to interact with those concepts.

I haven't read through this whole thread yet, so if you already have plans for the machine learning part, my apologies. I'll try to take a look at the thread and the rest of the project later today.

@erictleung yes go for it! Not much (if any) of the advanced lessons have been started yet. Thank you!

@erictleung we support a lot of pypi module (including numpy and scipy) on Repl.it. But let me know if there is something you need that we don't support.

@Ethan-Arrowood Hey, we're almost done building Repl.it's github integration. A few notes about unit tests:

  • we can display friendly error messages, right now I'm just using the method name. but I'm thinking we could do something like use the docstring instead for nice test failure messages.
  • we also don't currently support python's from x import y syntax but it wouldn't be too hard to add if it's necessary
  • inside Repl.it we write user code to main.py and automatically import it into the unit tests file using from main import *, so if you don't need the python unit tests to run on their own removing user code imports would be an easy fix. Otherwise, I propose we settle on one method for importing. Using from lesson_code import xyz style imports would be the easiest as we already just ignore these and the auto prepended from main import * would behave (mostly) the same way.
  • using file access like this to verify tests is a bit tricky just because the user's code will either be in main.py or not present at all (if we're not in project mode). I think using inspect.getsource is a good alternative.

Let me know what you think. I'll make github classrooms available to free code camp later today and then throw in unit tests once we've got the format figured out.

@amasad thanks for the quick response! I didn't know Repl.it had package support. Very awesome πŸ‘

The module I had in mind was scikit-learn. It is searchable in the module list, but it fails to load properly.

image

I suspect it has something to do with the dash in the module name. If I should report this somewhere else, let me know. I've checked that numpy works, so for now, I can use that.

@erictleung we haven't figured out how to best solve this problem because some module names are not the same as the import name. For scikit-learn it's sklearn. However, it also looks like we only have the python2 version (which you can also use) installed because it fails the following on Python3 (but works on 2):

>   from sklearn import datasets
Traceback (most recent call last):
  File "python", line 1, in <module>
  File "/goval_modules/python3.6/urllib2.py", line 220
    raise AttributeError, attr
                        ^
SyntaxError: invalid syntax

@turbio I'm pretty burnt out today but I'll make sure to review everything and work with you tomorrow. Thanks for all the hard work!

@amasad awesome! Thanks for the clarification and insight. I'll let you know if I come across anything else while writing up the code.

For reference, repl.it information on GitHub Backed Classrooms.

Here are my thoughts on resources to use for creating the curriculum:

I agree with the other's idea that Python should focus on the data science side. We can get more bang for our buck if we learn a new language and new skill set instead of using Python for web development. Learning web development in JS and then learning Python for data science provides enough overlap so that a dev can pick up python for web development.

I have some experience trying to teach people python in a decentralized way, having done so at Fordham university and at coffeeshops via the Meetup I organize: https://www.meetup.com/NYHAIS/

I use a combination of hacker rank and code academy. Having people start out with codecademy then jump on Hacker Rank's Python track helps a lot. We can use those two sites for inspiration on how to design our intro to python curriculum. For reference book, I point people to No Starch Press's Crash Course Python and Allen B. Downey's first book Think Python. We can see what is covered there and in what order and design tasks around that.

Lots of our work can also be aided by the work of Allen B. Downey of Olin College who has created a magnificent set of books on learning Python, Data Structures and Algorithms and Stats via Python. Check out his books on: http://greenteapress.com/wp/

For how to build this, we can look to this website for inspiration:
http://data8.org

We can also see how they use this thing called ok8:
https://okpy.org
https://github.com/Cal-CS-61A-Staff/ok

Python is a great language to pick up data structures and algorithms. This is asked for a lot during technical interviews and having a section on that can help enormously. For this we can look to Hacker Rank's Data Structures and its Algorithms track for inspiration on the types of challenge we can place in that section.

We can also look at UC San Diego's data structures and Algorithms micro masters for inspiration on how to explain things.
https://www.edx.org/micromasters/ucsandiegox-algorithms-and-data-structures

There is also interactive pythons free online course on the subject: http://interactivepython.org/runestone/static/pythonds/index.html

For the data science aspect we can look to Datacamp (an amazing resource), Dataquest, and the data science micro masters on edx.

We can also use this free book on introduction to data science.
https://www.inferentialthinking.com

The data science aspect can encompass learning the math and tools behind data science. Then once that is out of the way we can focus on the machine learning aspect with tensorflow and keras.

The trick is to introduce the probability, statistics and math aspects of data science gradually. So effectively we would be teaching these subject through python after learning the basics of the language.

For this, we can look to UC San Deigo's course "Statistics and Probability in Data Science using Python" on edX for inspiration.
https://www.edx.org/course/statistics-probability-data-science-uc-san-diegox-dse210x/

Any math concepts that need more explanation can be linked to a khan academy video if needed.

We can also look at Think Stats and Think Bayes by Allen B. Downey.
http://greenteapress.com/wp/think-stats-2e/
http://greenteapress.com/wp/think-bayes/

Along the way we can use introduce the various packages in Python that help us do statistical analysis. There is sympy for creating "Symbolic computation deals with the computation of mathematical objects symbolically". There are also other tools used by data scientists NumPy, SciPy, Pandas.

Another great source I found for data science is Chris Albon's site. The dude is next level.
https://chrisalbon.com/

Also this website and the links (and links of links) offer lots of good resources:
https://elitedatascience.com/learn-statistics-for-data-science

Any Thoughts?

These are some great ideas and resources. I will have to give them a more in-depth read over next few days, but here is what I have to say off the bat.

I think the data science track is a great idea as plays to Pythons strengths and would allow people to easily search StackOverflow for help if they ran across a problem.

I think a good middle ground would for us to set a threshold for introducing probability and statistics into the exercises. At this point, users should know basics (functions/variables/conditional logic) and how to import modules.

I think we could possibly create a survey to get some ideas of what people need/want to learn in prob and stat as a way to avoid trying to teach irrelevant things (I'm looking at you Ludic Fallacy).

Have we decided on Jupyter Notebooks as a medium for curriculum? I think this would be a great way for both us as programmers to reason about design choices(easier than rolling our own) and for users that get the robustness of notebooks.

Using Jupyter notebooks can allow for fast iteration. We can modifying it to imports of custom libraries like Pandas, etc.

The Ace editor would need some configuration. Repl.it looks ok, but the classroom UI isn’t pretty.
It would be more useful if it had unit testing built in.

I will start to work on intro curriculum based around Python 3 this week. It will be small simple examples that can be solved in 2 minutes of less, similar to Codecademy. It should introduce concepts slow and steadily while not assuming any prior knowledge.

Any updates to this? I too could start on some basic exercises and we could see what we come up with and maybe merge our solutions.

@tesla809 @vladdoster thanks for your interests in contributing to the Python curriculum!

@tesla809 I do believe that repl.it does have unit testing built in. What kind of unit tests were you thinking of? The unit tests I'm aware of is that you can build and use unit tests to test out the code users write. Great resources you've linked above, btw πŸ‘