CS Course for Dave
This is a Computer Science/Software Engineering course for Dave. The current overarching plan is for Dave to attain real job-readiness for an entry level professional web developer role in 3 years. The target workload is 30 hrs/week.
High level overview of what will be covered:
- Computer science fundamentals
- Basic algorithms and data structures
- Object oriented design
- Databases
- Linear algebra
- Linux, zsh, VMs
- C
- Python
- Java
- Javascript/HTML/CSS
- Node.js + Express
- MySQL/SQLite
- Basic regular expressions
- Mobile-ready web app design
- How to gather requirements and write a design document
- Unit testing and integration testing
- Sequence diagrams
- Data flow diagrams and analyzing system security via taint analysis
- Deep dives into developer best practices:
- Code smells
- Design patterns
- Strategies for avoiding rabbit holes, software rot, overengineering, etc.
- Use of key developer tools: command line, Git, IDEs, text editors, debugging tools, JIRA, etc.
- Completion of 2-3 major, portfolio-worthy projects
- Coding interview prep
The overall goal is to develop enough expertise in the area of web development to get an entry-level job doing front-end or full-stack web development. This web-specific expertise will be complemented by a working knowledge of multiple programming languages and a powerful toolbelt of knowledge and skills, enabling the further understanding and development into any further areas of interest for coding.
This is a living document. Things can and probably will change.
All homework listed in the plan below, and in each of the courses, must be completed and turned in to Joel for review.
Acquire a pen and a paper notebook. Use these to take notes about text/video course materials as you go through them. This not only will help reinforce what you learn, but will develop the habit of taking notes: you can vary this later (e.g. take notes on a computer, voice memos, ...) but for now, begin taking notes on paper as a matter of course -- and keep them organized. This is a core skill for a professional software developer.
https://memegenerator.net/img/instances/65839500/pen-and-paper.jpg
A very important skill in the developer's toolbelt is being able to find answers on their own and self-educate themselves to solve unknowns.
Accordingly, for ALL parts of this training, you can use Google and revisit course materials as often as needed. Asking questions on StackOverflow or similar is also acceptable (as long as you aren't just asking for answers to homework problems).
Plagiarism is not allowed for writing-specific tasks, but you can and should include references (URLs) to sources and quote freely.
For coding tasks, it's completely acceptable to borrow, import, and steal other people's code as you see fit -- but keep the spirit of the training in mind. If the task at hand is to implement the quicksort algorithm, it does you no good to copy and paste somebody else's implementation. On the other hand, if your goal is to display a sorted list of football player names on a webpage, don't waste time writing your own sorting algorithm: find something that exists to solve that problem and move on to more important things.
The plan is structured in blocks. Each block consists of one or more "tracks" of lessons or projects that will be completed in parallel. When one block is completed we'll move to the next block.
- TAKE NOTES FROM NOW ON.
- Read https://www.thinkful.com/blog/why-learning-to-code-is-so-damn-hard/
- Watch https://www.youtube.com/watch?v=mvK0UzFNw1Q
- Watch https://www.youtube.com/watch?v=kjBOesZCoqc&index=2&list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab&t=0s
- Read http://carlcheo.com/compsci
- Write 1-2 pages detailing any takeaways or other things you found interesting from the above text/videos.
- Write 1-2 pages describing a big challenge you have faced in life and how you overcame it.
- Solve for x in the following algebra equations:
- 7x + 3 = 17
- 8x + 16a = 8
- 0 = 9 - x
- a + b + c + x = y
- x^2 = 144
- 3x = 99y
- Read Chapter 1 of "The Pragmatic Programmer".
- Write a page summarizing the reading.
- Make a list of 5-10 ideas for software projects you might like to create. Could be a website, mobile app, PC program/game, or hardware based (drone, micro PC, etc.). Don't worry about how difficult, big/small, or "realistic" the projects are: this is just brainstorming stuff you would be genuinely interested in creating, or having a hand in creating.
- Pick an activity that you do every day, like making breakfast or something similar. It should be not too easy, but also not too difficult.
- Write down the steps that you should do for the activity, but do it out of memory in a different time to when you actually perform the activity. (Write the steps to make breakfast down in the afternoon.)
- The next time you perform the activity take your notes and try to follow the steps religiously. Try not to deviate from your written down steps and if you have to, note the differences down.
- Improve your algorithm until you are satisfied.
- On paper, create a conceptual mind map of a website that you might like to create. What are the different parts of the site that a user sees? What about the admins? Drill down into different specific features of the site. What (sub)systems might need to be in place to handle the different features? Does the site send email, sign up with Facebook, publish an RSS feed, post on behalf of users on Facebook? Does it have a shopping cart? What things would need to be in place to keep the site functioning and up-to-date over time?
- Write 1-2 pages describing a work of yours that you are proud of. What's the story behind it? Why are you proud of it?
Track 1:
- Complete weeks 0-5 of https://courses.edx.org/courses/course-v1:HarvardX+CS50+X/course/
- After completing each week, write a 1+ paragraph summary of what was covered/learned that week.
- After completing all 5 weeks, compile the summaries into a single document nicely formatted with Markdown.
- Create a new GitHub repository to store all the writings you create in this course and begin committing new writings there as you complete them. Use a coherent and consistent folder and file naming structure that will work going forward. Also give it a nice Markdown formatted README file.
Track 2:
- Complete watching https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab
- Write up a 1+ paragraph summary of each video and compile these into a single document nicely formatted with Markdown.
- Complete https://www.edx.org/course/linear-algebra-foundations-to-frontiers#
- After completing each week, write a 1+ paragraph summary of what was covered/learned that week.
- In each summary, include at least one image that supports the summary. This could include graphs found on the Internet or drawn by you, relevant memes, etc. as long as it fits with the narrative of your summary.
- Compile the summaries into a nice formatted Markdown document summarizing the course.
- After completing each week, write a 1+ paragraph summary of what was covered/learned that week.