joelpt / dave-cs

CS Course for Dave

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

dave-cs

CS Course for Dave

Overview

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.

Rules

Homework

All homework listed in the plan below, and in each of the courses, must be completed and turned in to Joel for review.

Take notes

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

Use Google-fu

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.

Blocks

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.

Plan

Anytime goodies

0.0

0.1

  • 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?

0.2

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:

About

CS Course for Dave