CS Education

During my undergrad studies at Georgia Tech, I took a CS intro class and a numerical analysis class, both of which used MATLAB heavily. I’ve expanded my CS education substantially since graduation, taking online courses, reading books, and building projects at home and work. My main interests and experience involve data analysis and organization.

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 MATLAB or Python’s IDLE.

Python logo

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

I made a Python program that takes a contact-list export from either iPhone or Outlook and converts them to Mozilla Thunderbird format using a pandas DataFrame structure. This way, I can maintain and view my master list in Thunderbird. Also, the program takes the new export and updates the master list by adding new entries or replacing any modified ones. This allows me to keep my phone contacts list more manageable, but I retain the old entries in the master list since the contact-sync program doesn’t propagate the deletions. This project gave me a chance to expand my Python skills 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

 

Next I read Pro Git by Scott Chacon and Ben Straub (available for free online).git logoI then built a networked garage-door controller that allowed me to open my garage door from my phone (before this was commonplace w/ IoT). 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 learned a lot about the Raspberry Pi, Linux, 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

Another project I built is a test data-processing 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 density. I collected data with two different data-acquisition systems, each with their own start time and sampling rates, and I needed a way to combine the data and plot them together with proper time alignment. Both systems measured engine speed, so the program aligns using that data. Then it “spaces out” any channels that were recorded at a lower sampling rate, so everything is in sync and shares a common time vector/index. Using MatPlotLib, it plots the pertinent data (engine speed, TPS, AFR), which is also saved to PDF for portability/archival. It also generates a CSV with the combined and synced data for each run for the same portability reason. A goal of the project was ensuring that I could output data that did not require knowledge of my Python program or Python in general to understand or make use of. We used these plots to make decisions about the speed and effectiveness of the EFI control system’s adjustments.

 

At this point, I wanted a more structured CS learning plan, and TeachYourselfCS.com fit the bill. TYCS is a free resource compiled by two CS profs to help self-directed learners. It lays out a concise catalog of nine essential CS topics with recommend book(s) and online lectures for each. Here are some highlights of my coursework:

  • The book and exercises of Structure and Interpretation of Computer Programs by Abelson and Sussman are recommended in the Programming subject of TYCS. The book uses Scheme, a dialect Lisp, to explore 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, elegant language.
  • As part of the Computer Architecture topic, 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.
  • The book Operating Systems: Three Easy Pieces by Remzi and Andrea Arpaci-Dusseau was a fascinating read. Since it uses Linux, Python, and C, I could 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.

A few years ago, I made the transition to using Linux full-time on my laptop. I enjoyed the experience of programming on the Raspberry Pi. This was a big boost for my CS education, as I now have more opportunities to interact with the terminal and automate tasks.

The Linux penguin, Tux

My biggest personal 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 computer storage hierarchy and copy them into the right directories for later access. I wrote a Python program that pulls the latest images and videos from the phone’s virtual file system. Then it prepends datestamps to the filenames and sorts them into folders by month and year [a few years later, the iOS device vfs adopted the same folder naming/organization, so I’ll take that as a complement!]. The program employs Phil Harvey’s awesome ExifTool Perl utility with Sven Marnach’s PyExifTool wrapper to extract the photo’s “date taken” info from the file’s EXIF metadata. Then my program displays each photo and provides an interface to quickly direct each file to the appropriate final destination – family pictures, documentation of an electronics project, cats, 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.

See my WORK page for various software programs I’ve built to facilitate my engineering work.

To more efficiently transition my career toward more data analysis visualization, I’m planning to start a data-science graduate program in Fall 2024.