freeCodeCamp / CurriculumExpansion

Creative Commons Attribution Share Alike 4.0 International
314 stars 104 forks source link

Roadmap of JavaScript Section of New Curriculum #89

Closed bonham000 closed 7 years ago

bonham000 commented 7 years ago

Topic of this Issue:

This Issue is about the proposed new JavaScript Challenges Section for the curriculum expansion and also the additional (more advanced) algorithms and data structure challenges that will become part of the coding interview preparation section.

The goal of the JavaScript section is to be 200 hours of JavaScript challenges, including the following topics: basic JavaScript, ES6, object-oriented and functional programming, regex, debugging, data structures, and basic algorithms. More advanced algorithm and data structure challenges will then be moved into the interview preparation section.

The purpose of this Issue is to review the proposed outlines of these sections and reach a consensus about which challenges should go where. Also note that a key goal of the JS section is to keep campers moving at a steady pace through the challenges and avoid any unusually difficult challenges that may halt progress.

bonham000 commented 7 years ago

Core JavaScript Challenges: 200 hours

— tentatively this outline is around ~150 hours

bonham000 commented 7 years ago

Advanced Algorithms and Data Structures

These challenges will fall under the optional Coding Interview Preparation section.

— tentative total of 150 hours — add mock interviews & soft skills training and the job prep section could be 200 hours

bonham000 commented 7 years ago

@erictleung @no-stack-dub-sack @QuincyLarson and anyone else — what does everyone think of the above?

Regarding the current algorithm challenges, I think the easiest solution is to move all the basic and intermediate challenges directly into the JS section and all the advanced challenges into the optional advanced section. That's what I've done here currently. If there are any outliers from either section, i.e. an easy advanced problem or a very hard intermediate problem, we could move them into the appropriate section.

Also the order of the sections is totally up for revision as are the time estimates for the new challenges.

HKuz commented 7 years ago

@bonham000 thanks for opening this issue - there are definitely some points for discussion on sequencing and breaking sections up.

For ES6/Basic JS - things may have changed, but I believe the idea was to layer the ES6 challenges into the existing Basic JavaScript section, since ES6 is considered just JS now. If that's still the case, we'll need to go through and figure out a sequence that makes sense, get the challenges to flow together, and see if any of the existing JS ones need to be updated or removed. (For example, we may need to tweak the existing challenge about the var keyword, so it fits with the new ES6 ones about let and const). One thing to note, none of the ES6 challenges have been seeded into the feature/curriculum-expansion branch yet - of course, this won't hold up getting a draft challenge sequence done.

Both the Regex and Debugging section challenges are written, seeded, and QA'd - they were over in #22 and #47, respectively 👍 . I'm actually in the process of giving them both a 'final' re-read to conform language, and will have a PR ready once my other features/curriculum-expansion branch PR is merged. The Regex section has 32 challenges and has "5 hours" for time in its json file, and Debugging has 11 challenges and has "1 hour" for time in its json file.

The jQuery challenges are now in the Front End Libraries sections, which comes right after the JavaScript section (issue #46 has more details) - so no worries about fitting them into the JS section. For comparison's sake, that issue also shows the current thinking about the order of topics within the JS section.

My two cents - I like the idea that the data structures section focuses on the basics (arrays/objects) in the front section for JS - it keeps with the 'core JS' theme. Campers should have a solid understanding of how to work with those before attempting the advanced ones you split out. The advanced topics are awesome, and will be great for interview prep. I think they'll be better appreciated there, too. Some campers coming through the curriculum may be chomping at the bit to get to the libraries section (particularly React/Redux challenges) 😀

bonham000 commented 7 years ago

Ok, great @HKuz! I agree about the advanced data structures, they are really too much for just gaining an understanding of JS and are a much better fit for the interview preparation section. I updated the above with information you provided about ES6, regex, debugging, and jQuery.

no-stack-dub-sack commented 7 years ago

@bonham000 Before I go on to read and comment on all the rest:

Where do the jQuery challenges go?

My understanding is that now any framework specific challenges will not get introduced until after the basic JS section - this will be a part of the Front End Libraries section along with React, Bootstrap, etc. The idea being getting folks familiar with the core JS concepts so they are not leaning on frameworks (that make development easier) straight out of the gate.

EDIT: Whoops - I just realized @HKuz said the same thing in her post! :disappointed:

bonham000 commented 7 years ago

Taking a look at #46 which I had not seen yet, just removed the line about JSON/APIs from above as well. And yes @no-stack-dub-sack seems like that is the consensus.

no-stack-dub-sack commented 7 years ago

@bonham000 @HKuz @QuincyLarson - are the interview prep sections still going to be made available only once the rest of the curriculum has been completed?

I only ask because if the really advanced data structure challenges etc. will be there, what if a professional programmer who just wanted to utilize FCC for some extra practice wanted to take a whack at them? If we're keeping with the theme that FCC should be more than just a learning tool for beginners after the update, maybe we can consider this... that's just one scenario too, I can see others where folks might want to get their hands on those challenges before completing the rest of the curriculum. Apologies in advance if this has already been addressed somewhere...

bonham000 commented 7 years ago

I don't think this has been discussed anywhere but I assume they will be available for anyone especially because they are just regular challenges like anything else.

However, since there are going to be several 'optional' categories, such as the optional bonus projects, the entire section could just be an optional section under the name Advanced Algorithms and Data Structures, and job preparation could remain separate as it is now and still requiring full stack certification to access.

HKuz commented 7 years ago

@no-stack-dub-sack I haven't seen that discussed anywhere either. I see the value in restricting things like mock interviews, or access to mentors, but challenges and algorithm practice seem like they could be open to anyone. I defer to @QuincyLarson on this one 😄

A couple other minor points to keep all the JS discussion in one place:

The OOP section was re-written (see #15), so no FP stuff covered there anymore. There was some talk about adding a challenge or two discussing the ES6 class syntax that makes writing a lot of what's covered in that section easier (the syntactic sugar). There are some challenges written (and some to come) in the ES6 section. It may make more sense to move those to the end of the OOP section. ("This is another way to write what you just learned")

There were a handful of new challenges for the existing JS section (#14), plus some comments on the section as a whole. My to-do list includes reviewing those items to make sure we don't miss anything.

And issue #86 was opened talking about adding challenges for Callbacks, Promises, and Async/Await. And to your point about Promises, Async/Await, and Generators, I haven't seen anything created for those topics, either.

bonham000 commented 7 years ago

So @HKuz that #14 represents the entire new basic JS algorithms section—those aren't just additions?

no-stack-dub-sack commented 7 years ago

@HKuz @QuincyLarson

I see the value in restricting things like mock interviews, or access to mentors...

I agree on this point fully, so maybe we can lock just those features and still allow access to the challenges.

Awesome work overall @HKuz! It seems like you have a really solid handle on what needs to be done. I'm really looking forward to enjoying the fruit of everyone's extensive labor!

HKuz commented 7 years ago

@bonham000 that issue was for the existing JS section, and the list has mostly the existing challenges, with a few new ones at the end. The new challenges proposed are buried in the comments (some were incomplete, some done). I need to go through and review them and see if they can be seeded.

And thanks @no-stack-dub-sack - that goes both ways. I see all the work you've been putting in on the testable user stories for the projects. Good stuff all around!

bonham000 commented 7 years ago

Awesome! I've updated the outline to reflect all of this new knowledge coming from @HKuz and definitely agree about the advanced challenges & interview prep. So my only question then is that this has the JS course looking to be less than 150 hours. Is that okay?

HKuz commented 7 years ago

Looks good! I'm not sure on the timing question. I've seen that each of the 6 sections for the new curriculum setup target 200 hours each, so may be a little shy.

QuincyLarson commented 7 years ago

@bonham000 our goal is to make everything 100% accessible to anyone at any time - without even logging in. Currently this is true for all but the nonprofit projects and interview prep section. But going forward, campers will be able to contribute to our Open Source for Good projects without having completed the first 1,200 hours (though completing the first 1,200 will still be required before they can claim the final certificate).

We probably do want to have the ES6 section labeled as ES6 and a distinct section at end of the JavaScript section so that campers will understand that we do in fact teach ES6, and so they can navigate directly to those.

We'll also want to have a basic data structures section that goes slightly beyond the data structures covered in the main JavaScript section.

Then we'll take the harder algorithm and data structure challenges that don't fit in a realistic 200 hour timeline and move those to our Coding Interview Prep Practice section.

I've asked @evaristoc to see if he can put together a table of which algorithm challenges take the most time and most tries on average to complete. From this, we should be able to identify challenges that are too easy and too hard and move them around accordingly. This said, your subjective assessment would be useful as well.

Finally, @HKuz note that the 200 hours each section is a rough goal to work toward, and not something we need to get perfect for each section at this point.

bonham000 commented 7 years ago

Sounds good @QuincyLarson I've updated the above to reflect this!

evaristoc commented 7 years ago

@QuincyLarson Got it. I might have other obligations along the week and Christmas is close so it won't be immediately but I will work on it. I hope that you all don't have a problem if it might take a week maximum to deliver the analysis?

QuincyLarson commented 7 years ago

@evaristoc understood. I think you collected data on this a long time ago. Do you still have that old analysis? Even though it's old, it would still be helpful :)

bonham000 commented 7 years ago

I think the easiest revision would be to just move any intermediate algorithms that appear unusually difficult into the advanced section, and the opposite for any unusually easy advanced algorithms.

QuincyLarson commented 7 years ago

@bonham000 I agree - this sounds like a sane approach.

evaristoc commented 7 years ago

@bonham000 @QuincyLarson Hope you are both fine. Here the analysis I promised (sorry, Quincy! Just found your message asking for the previous one!).

This is though a more recent analysis with added information. I took the liberty to suggest a simple metric of performance based on Average Time on Page and Trials to solve the challenges. Those two measures individually will give us an idea of the performance of the campers but a composed metric, based on the combination of those two, would be more powerful.

Taken them individually presents some limitations hard to explain here. If you want to know more please contact me.

The performance metric consists in multiplying Average Time on Page by Number of Trials to Solve a Problem divided by Number of Unique Trials. Number of Unique Trials is a proxy to Successful Trials (i.e. "the camper solved the problem").

The higher the value of the performance metric, the more difficult the challenge could be because:

Although Time on Page could be a good one, spending time in solving a problem is not enough to explain difficulty: it can be just a long solution, but NOT difficult.

The metric was used to indicate difficulty by section of the curriculum. I found that the average performance of the challenges at each section was specific to that section. I am taking then the average performance PER SECTION, multiplied by 1.5, as a value reference. The 1.5 is just the value I found more convenient after trying other values.

Challenges IN THAT SECTION with a performance metric HIGHER than the reference are indicated as requiring further action.

You can find a view to the final results of this analysis through the following link:

https://drive.google.com/file/d/0B9B84yYIfPpYOGw0Qi1hRVlNRlE/view?usp=sharing

CHECK SpreadSheet "Table - Challenge Solving Time" to find the final metrics and indicators.

In my opinion, the indicator works as expected and helps to detect those challenges requiring immediate attention.

You can find additionally the Average Time on Page and the inverse of the Trials/Success ratio also in "Table - Challenges..." spreadsheet of the document.

Still, things to take in account with this analysis:

evaristoc commented 7 years ago

@bonham000 As @QuincyLarson suggested here a quick chart I prepared based on similar data almost a year ago: http://codepen.io/ecccs/full/MKdLpQ/

Noticing though that it might not adjust to all page sizes!! I am using other computer and some of the elements are taken to an undesired position.

Sorry for that, hope there are no issues with your view...

bonham000 commented 7 years ago

@evaristoc @QuincyLarson That data looks great! Here is what I am thinking after looking at it and reflecting on my own experience working through these problems, especially considering your comment @evaristoc that:

an algorithm that it seems to be hard, should stay in that position in the curriculum because it presents a concept that will make challenges further down in the curriculum easier to solve.

I think that none of the Basic/Intermediate challenges should be bumped to Advanced, but rather just some rearrangement is necessary. Here are my suggestions:

Basic Challenges:

- 🔽 Check for Palindromes: move up in this section. - 🔽 Title Case a Sentence: move up in this section. - ⏬ Seek and Destroy: bump to intermediate. - ⏬ Check for Palindromes: bump to intermediate. - ⏬ Caesars Cipher: bump to intermediate.

Intermediate Challenges:

- ⏫ Boo Who: this needs to move back to Basic. - ⏫ Find Keepers: could move back to Basic. - 🔽 Wherefore art thou: could move up in this section. - 🔽 Spinal Tap Case: could move up in this section.

Advanced Challenges:

- ⏫ Make a Person: probably move back to Intermediate. - ⏫ Map the Debris: probably move back to Intermediate.

I think having some variation in the difficulty posed by each challenge is good for campers and keeps things interesting. For example, in my experience when I was really stuck on a challenge, I found that by skipping it and moving on and solving later challenges (probably because they were easier) helped me maintain confidence that I could still solve the previous challenge, which I then would. Nevertheless, I think some extreme outliers like those above should be moved.

evaristoc commented 7 years ago

@bonham000 Glad you like it!

Yes, I think we have to see which of those challenges are representative of new concepts that could be relevant for other challenges further down in the curriculum.

As I said, the analyses I made couldn't target relationships: it is a metric for the performance of the users at that challenge only. It is a good indicator that "something is happening".

I would say: BASIC ALGORITHM:

INTERMEDIATE ALGORITHM:

ADVANCED ALGORITHM:

evaristoc commented 7 years ago

@bonham000 This can always be followed up... We can make those simple changes and compare effects after 2 months.

@bonham000 I think just moving the challenges to a better position will have already a GOOD impact! I think we haven't taken in consideration the possibility that by keeping harder-that-should algorithms in sections where the challenges should be easier, we are sending some incorrect signal to first-time-programming campers.

You said:

I think having some variation in the difficulty posed by each challenge is good for campers and keeps things interesting... Nevertheless, I think some extreme outliers like those above should be moved.

:+1:!

evaristoc commented 7 years ago

@HKuz @no-stack-dub-sack You have been working on challenges recently? Any opinion about the suggested changes? https://github.com/FreeCodeCamp/CurriculumExpansion/issues/89#issuecomment-269238678 by @bonham000 https://github.com/FreeCodeCamp/CurriculumExpansion/issues/89#issuecomment-269303404 by @evaristoc

We are partly using data and analyses commented at https://github.com/FreeCodeCamp/CurriculumExpansion/issues/89#issuecomment-269218703 by @evaristoc + some common sense...

bonham000 commented 7 years ago

Yes, I agree with all of this @evaristoc especially the comments about the Regex challenges in Basic. If there are additional Regex challenges in the works it would be great to group those together because Regex is a lot to learn on its own (and hard). And yes, it looks like these rearrangements would probably have a good impact and could always be reevaluated in the future.

QuincyLarson commented 7 years ago

@evaristoc @bonham000 I'm a bit late to comment. First of all, thank you @evaristoc this was precisely the data I was hoping you could share. I don't think these challenges have changed significantly since last year, so these data should be actionable.

@bonham000 there's a practical reason why we wouldn't want to move challenges from advanced down to intermediate - people who who are past them will complain that we keep "moving the goal posts." I think it would be better to put Make a Person and Map the Debris at the very beginning of the advanced algorithm challenges so that they remain optional.

@bonham000 Also, have you considered which of the data structures challenges should go into a "basic data structures" section that could be either before basic algorithms or before intermediate algorithms?

bonham000 commented 7 years ago

I think that if a Basic Data Structures section is added to the JavaScript curriculum, as suggested above, it really only needs to present arrays and objects. These are the fundamental JS data structures and for the majority of the FCC curriculum there is no need to go beyond this. Even the new ES6 Map and Set are really just fancy objects and I think they, along with the new work on Stacks, Queues, Lists, Trees, and Graphs, are all better suited for the optional interview prep section where they are more relevant to that topic.

Because of that, I think any challenges that currently target arrays or objects specifically could be put here, or, a small series of challenges specific to these data structures could be created for this purpose because at the moment nothing like that exists as far as I know. The place for this in the proposed outline for the JS section would put these right after OOP and FP challenges and before all the algorithms so I think this would be a great place to introduce these basics data structures as a toolset to then put to use in the algorithm challenges.

no-stack-dub-sack commented 7 years ago

@evaristoc - sorry to be jumping in a little late here. But it's been a bit too long since I've done these algos to really comment on where they should be. Although I do agree with @bonham000's suggestion above regarding data structures. Namely for this reason:

...for the majority of the FCC curriculum there is no need to go beyond this.

introducing anything significantly more complex too early on has the potential to detract from forward progress.

One thing I do remember well about the algos was that seek and destroy was the hardest one for me. I don't think that should be considered basic...

bonham000 commented 7 years ago

Here is a proposal for the new order of the Basic and Intermediate Algorithms based on the above comments @QuincyLarson:


Basic Algorithms:

Intermediate Algorithms:

I still think Make a Person and Map the Debris should be moved back to Intermediate from Advanced because these are really easy compared to other advanced challenges, and, since so many changes are being made with the curriculum expansion this would be an okay change to make.

bonham000 commented 7 years ago

Proposed Basic Data Structures Section:

This has been moved to a new issue for development

@QuincyLarson this can serve as a rough draft of what this section might look like. We can make a note at the introduction of Objects that these are specifically challenges regarding JS objects as applications of the hash table/dictionary data structure, and that other OOP applications of JS objects are covered previously in the OOP section. We can also mention toward the end that this discussion just scratches the surface of core CS data structures and that there are further optional lessons in advanced section.

@no-stack-dub-sack what do you think of these? I think we can work off of this list and modify it as we go. I think each challenge can be relatively simple with the overall goal being to give the camper a clear sense of what these data structures are and how/why they can be used.

note: once we begin working on these we can branch it out into a new Issue

no-stack-dub-sack commented 7 years ago

@bonham000 this looks great to me! Should be easy enough to write these and I think they have a nice flow, order makes sense.

HKuz commented 7 years ago

Hi folks, there's a current issue open about the Friendly Date Ranges algorithm, which sits in the Advanced Algorithm section (see https://github.com/FreeCodeCamp/FreeCodeCamp/issues/12305). One of the requirements of the challenge, and some tests have to do with whether the given dates are in the 'current year'. Now that it's 2017, it either needs to be re-factored (likely every year, how it's worded), or we remove/replace it with something else. Here's a link to the challenge text.

If we do want to keep it in the mix, we should consider adjusting the requirements about the 'current year' - that way, at least, the challenge won't need a re-do every new year. I'm curious to hear what others think.

QuincyLarson commented 7 years ago

@bonham000 awesome! This looks like a great list. I think you can get started doing this, and may want to look at the current object and array challenges in our JavaScript curriculum to see if those can be improved upon as well, or if their structure can be mirrored here in the data structures section.

QuincyLarson commented 7 years ago

@HKuz thanks for bringing this to my attention. Since it's a broken challenge, I'm going to remove it completely for now, and we can worry about refactoring it later.

systimotic commented 7 years ago

Hello humans! Since the "Friendly Date Ranges" challenge is being removed, but it still has to be refactored, I popped all of its code into a gist so it's easy to find. 🙂 https://gist.github.com/systimotic/08ae66edfaf4a365a4faf56583731faf

HKuz commented 7 years ago

Thanks, @systimotic! 🎉 👍

QuincyLarson commented 7 years ago

@systimotic agreed. Would you be interested in refactoring it?

By the way, we weren't the only people who encountered a bug during the new year: https://blog.cloudflare.com/how-and-why-the-leap-second-affected-cloudflare-dns/

QuincyLarson commented 7 years ago

@bonham000 OK - this looks great. I agree with your assessment that we should move Make a Person and Map the Debris into intermediate.

We will move all the advanced algorithms and data structures challenges into our Advanced Practice Projects section. We don't need time estimates for the challenges/projects that fall into these categories.

Once you're done with https://github.com/FreeCodeCamp/CurriculumExpansion/issues/90 I will import these into the seed files.

bonham000 commented 7 years ago

@QuincyLarson sounds great! Peter and I split the basic DS challenges up so he should be tackling the challenges on arrays, but the object challenges are finished. Of course, these will still need some level of QA (especially because these are in the main JavaScript section and represent an important piece of the curriculum).

no-stack-dub-sack commented 7 years ago

@bonham000 @QuincyLarson I have finished most of the work on the testable projects project at this point and am moving on to the array challenges - time is a little less abundant these days but should be able to write them this week!

HKuz commented 7 years ago

@QuincyLarson @bonham000 @no-stack-dub-sack - there's one tweak I'd suggest about the sequencing in this section after looking at the challenges being written for the Basic Data Structures section. I think Basic Data Structures could be moved up so it comes right after the JS and ES6 sections. At least, I'd say to move them before the OOP and FP sections, since those challenges seem to assume campers have a good working knowledge of how to manipulate and access arrays and objects by that point.

Just a suggestion, let me know your thoughts...

bonham000 commented 7 years ago

Yes @HKuz I think that is a good suggestion. I just changed the ordering above so we can see how that looks, if everyone agrees we can leave it like that.

QuincyLarson commented 7 years ago

@HKuz I agree as well - this seems to be the logical place to introduce these.

@no-stack-dub-sack thanks for the update on these challenges. We are still waiting on a few projects, but other than that, I think the curriculum expansion is almost ready to be merged into staging.

Even if not all the challenges are ready, @raisedadead will merge what is ready this weekend.

no-stack-dub-sack commented 7 years ago

@HKuz Agreed, makes sense.

@QuincyLarson Sounds good, I should have these done by the weekend, just have a few left to go. I will post them all in #90 when they're done.

no-stack-dub-sack commented 7 years ago

@bonham000 @HKuz @QuincyLarson @evaristoc Just a thought - I know we have discussed FCC becoming not only an interactive learning platform, but with the advent of the new and improved searchable map, also a quick-reference guide for aspiring and professional devs alike. If this is to be the case, do you guys think we should consider - with challenges like the new basic data structure challenges ( #90 ) - putting the challenge topic's syntax right at the top of the page in a highly visible and obvious way, à la MDN?

I hate to create more work for all the hardworking contributors, but curious to know what others think about this...

As it currently stands, "quick-reference" is not how I would see these - you would either have to read, or, solve the challenge to understand what's going on. By adding this though, visitors could synthesize at glance the information they're looking for.

i.e. Array.push(elem1, elem2...)

Of course, this is something that could always be added later as we are in or as we move out of beta

QuincyLarson commented 7 years ago

@no-stack-dub-sack this is a good point. Yes - this is definitely something we could including later on once we've shipped the curriculum expansion and finished overhauling the UI to make it more search-focused.

systimotic commented 7 years ago

@QuincyLarson

@systimotic agreed. Would you be interested in refactoring it?

I'd like to, but my ToDo list if already overflowing, so I'm focusing on that first. I'll pass on this one 🙂