CS Education

In college, I took a CS intro class and a numerical analysis class, both of which used MATLAB. Driven by my interest in control systems and information security, I’ve gotten back into learning programming and CS more seriously in the last several years. I took MIT 6.00SC first, which was an intro to CS that used Python. I then went through the book/course “Learn Python the Hard Way”, which was nice because it taught how to use a regular text editor and the terminal instead of an all-in-one IDE like Python’s IDLE or MATLAB’s…whole thing.

Python logo

After taking those two Python courses, I built a few projects to apply my knowledge.

I built a networked garage-door controller that allowed me to open my garage door from my phone. I used a Raspberry Pi to host a Python web server and actuate a relay to mimic a wall-button switch. Before tackling this project, I read the (lengthy) book Exploring Raspberry Pi by Derek Malloy. I found it very informative about the Raspberry Pi, Linux in general, Git, embedded electronics, sensors, etc. It was my first introduction to both Linux and Git, both of which I use extensively now. Click here to see the code on my GitHub page.

Raspberry Pi and relay board installed
Raspberry Pi garage-door control server

Next I read Pro Git by Scott Chacon and Ben Straub (available for free online).

git logo

I next made a Python program that takes a contact-list export from either iPhone or Outlook and converts them to Mozilla Thunderbird format using a DataFrame intermediary data structure from the pandas module. This way, I can have my master list in Thunderbird. Also, the program will take a new export and update a master list by adding new entries or replacing any modified ones. This way, if I choose to delete some contacts from my phone, my contact-sync program doesn’t propagate the deletion. It takes the union of the new offload and the master list so I can delete phone contacts but know I have an all-inclusive list to reference if I ever need that contact later. This project gave me a chance to expand my Python skill and work with Git in real life, since I used Git for the revision control here (and on every project since). Click here to see the code on my GitHub page.

iOS, Thunderbird, and Outlook contact synchronization

Another project I built is a data-sync program for work, again using Python. I had just finished performing high-altitude testing on some vehicles in the mountains to validate our new EFI system was adjusting properly for the decreased air pressure. This involved collecting data on two different data-acquisition systems though, each with their own start time and sampling rates, so I needed a way to combine the data in such a way that I could plot them on the same graph with proper alignment of the time values. Both systems measured engine speed, so the program used that data to line up the time values. Then it “spaced out” any channels that were recorded at a lower sampling rate, so everything was in sync and shared a common time vector. Using MatPlotLib, it plots the pertinent data (engine speed, TPS, AFR), which was also saved PDF for portability/archival. The last step was exporting the combined and synced data to CSV for each run so the program would not be needed to regenerate graphs or perform further data analysis. A goal of the project was ensuring that I could output data that did not require knowledge of the Python program or Python in general to understand or make use of. It processed the data and spit out combined CSVs that anyone can use later.


Up to now, I had just done online courses and read books here and there as part of my CS education. I wanted a more structured learning plan, and I found it on TeachYourselfCS.com. This simple and free resource was written by Oz Nova and Myles Byrne, two college professors from the Bradfield School of Computer Science in San Francisco, and is “based on [their] experience teaching foundational computer science to hundreds of mostly self-taught engineers and bootcamp grads”. TeachYourselfCS.com lays out a concise catalog of what they deem the most essential nine CS topics. They recommend their favorite book(s) and online lectures for each topic, forming a low-cost, workable, and inviting study plan. I’ve listed some of the highlights of the coursework I’ve encountered so far.

  • The book and exercises of Structure and Interpretation of Computer Programs by Abelson and Sussman are recommended as part of the first subject of TYCS – Programming. It uses Scheme, a dialect Lisp, to explore both fundamental topics like recursion and argument evaluation as well as deep concepts like sameness, state, and scoping. After reading this book and doing all the exercises, recursion comes very naturally, and I have an appreciation for what is possible with such a simple-seeming, elegant language.
  • The book and projects of The Elements of Computer Systems (a.k.a. “Nand2Tetris”) guide the reader through building a computer from the NAND up using HDL (hardware description language) in an emulator program. One of the major tasks was writing an assembler, and it was rewarding to see the machine language I generated running on the functioning computer architecture I built. This was part of the Computer Architecture topic in TYCS.
  • The UC Berkeley CS61C lectures by Krste Asanovic were also recommended in the Computer Architecture section of TYCS. I found these lectures interesting and thorough.
  • The book Operating Systems: Three Easy Pieces by Remzi and Andrea Arpaci-Dusseau is a very neat read, especially since it uses Linux, Python, and C so I can explore all the internal workings on my own laptop.

Three books: Structure and Interpretation of Computer Programs, The Elements of Computing Systems, and Operating Systems: Three Easy Pieces

I’m a bit over halfway finished with the 9-subject TYCS series. I’m also taking the Learn C The Hard Way course currently, since several of the classes in TYCS use C, and I’d like to get more experience and familiarity with it.

A few years ago, I made the transition to using Linux full-time on my laptop. Up to then, I had used Windows 7, but support was ending for that OS, and I enjoyed the experience of programming on the Raspberry Pi (running the Debian-based Raspbian). I decided it was time to make the transition, so after trying several distros, I chose Linux Mint with the Cinnamon desktop, and it’s worked well for me. This was a big boost for my CS education, as I now get much better access to the OS internals and more logical systems and native applications. It is a much more programmer-friendly environment that generally just works in a way that makes sense instead of the obscure, esoteric world of Windows.

The Linux penguin, Tux

My biggest Python project automates the offloading, organizing, categorizing, and archiving of my iOS photos and videos. For years, I’ve used a manual system to back up these pictures/videos to my home storage hierarchy and copy them into the right directories for later access. I realized most of this could be automated, so I wrote a Python program to handle everything. It pulls the latest images and videos from the phone’s virtual file system. Then it datestamps them and sorts them into folders by month and year. The program employs Phil Harvey’s awesome ExifTool Perl utility with Sven Marnach’s PyExifTool wrapper to extract the photo’s “date taken” embedded in the hidden EXIF data. Then it displays each photo and provides an interface to quickly direct each file to the appropriate final destination – family pictures, documentation of an electronics project, etc.


Another recent project is a set of bash scripts to automate tiers 2 and 3 my computer backup strategy. Tier 1 is an automated weekly backup to my NAS. Tiers 2 and 3 involve monthly/bi-monthly detailed rsync jobs to back up my computers to external drives that both stay offline most of the time, and Tier 3 stays off-site. The rsync script will check for the presence of the drive(s), and run multiple rsync jobs with various options, including different handling of symlinks, includes, excludes, propagating deletions, etc. All the jobs use verbose logging, compression, and partial-copy buffering.


Other than taking online courses and building projects, I’ve found that security podcasts have bolstered my education by providing important context for the topics I’m learning about. Podcasts like Security Now, Darknet Diaries, Smashing Security, and Malicious Life have helped by familiarizing me with important terminology and showing the serious impact technology can have on the world – for good or evil. Learning is much easier, more engaging, and longer-lasting when you can relate topics to an existing mental framework.

Podcasts: Security Now, Smashing Security, Darknet Diaries, Malicious Life

I really enjoyed Storytelling with Data by Cole Nussbaumer Knaflic, and I’ve adopted many of its recommendations for data-presentation work at my current job. Lately I’ve gotten more into data analysis and data visualization in general, and I’m exploring different data-science graduate programs to start in Fall 2023.