March 20, 2020

### My College Workflow

It is now my second semester in college, and it's been a pretty steady ride so far. In the last few months, I've developed a studyflow that I think works for me, and I figured I might as well share it here. This post will contain some general things, but it'll be very largely targeted towards what a CS major would care about, given that I'm a CS major. I'll break it down by course, as most of my process will probably carry forward to future similar courses.

I'll describe my process for each course and then explain the setup I have on each of my devices, to bring things full circle. For now, just note that "Book" refers to my first-generation refurbished Surface Book, which I got from Amazon, and "laptop" refers to my Lenovo Legion Y545, which I got from Costco.

Warning: there's a lot of links below, but I promise I'm not sponsored :)

Let's start with my engineering course: EECS 16A, 16B - Designing Information Devices and Systems I, II. Lecture notes are taken by hand in the Drawboard PDF app on my Book, compressed and transferred to my laptop, and uploaded to a git repository. They are then copied over to the notes repository, where they are hosted for public access (I intend to make this more efficient eventually by switching to submodules, so that I don't upload the same things in multiple places). Homework is also done in the Drawboard PDF app on my Book, compressed and transferred to my laptop, and uploaded to a separate git repository as well as the submission portal. This repository also contains discussion worksheets (completed in Drawboard PDF) as well as the software portion and directions for each lab. Our labs consist of Jupyter notebooks containing directions and software portions, which I complete and run on my laptop.

The next course I'm in is EECS 70 - Discrete Mathematics and Probability Theory. Lecture notes are done the exact same way as for 16A and 16B. For homework, I use the LaTeX extension for VSCode and have a LaTeX template for homeworks, so everything is streamlined and I basically just have to fill things out. Scratch work is done in OneNote on my Book, and relevant parts are copied over. The homework is saved and uploaded to a separate git repository as well as the submission portal. This repository also contains discussion worksheets (completed in Drawboard PDF). The thing with homework for this class is that it's pretty long (this semester, at least), and I never do it in order. I'm always worried that I'll miss something though, so I (mis)use GitKraken's Glo boards to track my progress. Every part of every question gets a card dedicated to it (with one column per homework) and each card is tagged "Not Started," "Revisit," or "Complete." It's pretty satisfying when everything's marked "Complete."

The third course I'm in CS 61B - Data Structures. The course is primarily taught in Java. Lecture notes are... unfortunately not taken. I realize now that I should've been taking notes, but I feel like it's too late for that now. Plus, I genuinely feel like I've learned without the need for notes, so I didn't really take any. Homework, labs, and projects are all done in VSCode, using the Java extension by Microsoft. The course recommends IntelliJ, but after having used both I found that VSCode had the exact same functionality but without the clunkiness and large memory/CPU usage of IntelliJ. Don't get me wrong, IntelliJ is a fantastic IDE and I absolutely love it. I just didn't need its power for this course. The biggest caveat to using VSCode, though, is that the way the course assginments are designed, there's a set of course-specific libraries for us to use. This actually works out better for me than those who choose IntelliJ: for IntelliJ, students have to manually add all the libraries to the IntelliJ project associated with every new assignment, which is a few mundane steps to take each time. Plus, if you make a mistake during the setup process, your code won't work, and I've seen a large amount of Piazza posts just asking for IDE initialization help, even this far into the semester. My setup? I have a script that creates a .vscode/settings.json file that looks something like this:

{
"java.project.referencedLibraries": [
"lib/**/*.jar",
"/home/vs/61/cs61b-software/lib/**/*.jar"
]
}

And that's pretty much all I need to get going -- a simple script takes care of everything for me, and I haven't run into issues with any of my assignments. I'm sure you could write a script for IntelliJ too, but I just really like the smoothness, overall cleanliness, and versatility of VSCode.

That said, I'll describe my full setup too, because it's a little hard to replicate this from the bare detail above.

First off, my Surface Book. Pretty empty, not a workhorse. I have a PRO license for the Drawboard PDF app, which gives me the ability to ink existing PDFs (think: practice tests, discussion worksheets) as well as make new ones (think: notes, homework). I wasn't a fan of the subscription-based fee at first, considering the iOS equivalent of the app (GoodNotes) is a one-time purchase, but I've come to love the app and don't mind shelling out a few bucks for it. I also have WinSCP installed for transferring files to my laptop, though I often just use Windows' built-in Nearby Sharing. For scratch work, I use OneNote. This works pretty well when I need to work out problems that I'm explaining to other people, or when I'm doing some kind of practice that's either not in PDF form or is too short to download and pull up (think: a couple of questions). Other than that, I also have VSCode installed, but with almost no extensions. I just have the Remote - SSH plugin, because I connect it to my laptop's WSL instance to access my VSCode setup on my laptop remotely.

Speaking of which, let's move on to my laptop. First and foremost, I don't have any programming language support on my laptop, except for IntelliJ's built-in Java binaries. This is because all of my CS tasks happen inside my WSL Ubuntu instance. I have VSCode on my laptop, but I use it exclusively with the Remote - WSL plugin to connect to my WSL instance, where I have Python and Java support for coursework as well as all sorts of remote plugins: Markdown, IntelliCode, Java, Glo, HTTP Server, LaTeX, MathJax, Python, SQLite, and Scheme. I also have a nifty Spotify plugin that lets me control music playback without leaving VSCode. The only reason everything's inside WSL is because I'm a fan of Linux, and I just don't find programming with a Windows architecture to be as efficient or well-supported. The Linux terminal far outperforms Command Prompt and Powershell, and the ease of manipulating things through the terminal when I'm inside VSCode draws me to WSL. The Tokyo Night theme coupled with the Helium Icon Theme, plus some BROCKHAMPTON or something in the background, makes for a solid workflow. I mentioned that my EECS labs are done in Jupyter notebooks -- I didn't want to install all the libraries associated specifically with those labs onto my hard drive because, well, there were quite a number of them. Instead, I created a Vagrant machine -- a container, more or less -- that contains all of the libraries I need, along with Jupyter. Every time I need it, I just spin up the Vagrant machine, use Jupyter on the files that are shared between my hard drive and the VirtualBox-based VM, and destroy the machine when I'm done. Takes a bit longer to get going, but has the same end result and less net space used on my disk!

Now that I think about it, my WSL Python support is fairly limited. There's a few key libraries installed that I needed for personal projects, but there are no EECS-related libraries or ML libraries. There's a separate Vagrant machine that holds all of my ML libraries, especially because I've been manually building Tensorflow while there isn't official support for Python 3.8. Again, takes a little longer to get going, but the end result is the same because everything I do in Vagrant requires Jupyter anyway, which I run from inside Vagrant. It's a weird setup, but I find it efficient!

My WSL instance also has a couple of helpful scripts for my study flow. The first of these checks all of my school-related git repositories at once, letting me know if there's work to be pushed. The second is a script for EECS 70 homework which generates the template for every new assignment and downloads the relevant problem sets at the same time. Lastly, I mentioned by CS 61B script which imports the course's Java libraries into VSCode for every assignment, but it first fetches the assignment skeleton from the course's git repository. Then, it adds the VSCode settings, pushes the new files to my submission repo, and then pushes them to my personal git repo (the course uses instructional servers for us to submit our work through, but I like having a copy of it on my own git flow).

The last thing I regularly use in workflow is Notion, which is a multi-purpose note-taking app that's... sort of based on Markdown? But not really. I use it for weekly planning, which I didn't used to need until this semester. Each week has tasks listed by status, or type, or due date. Status is one of "To do" or "Completed," and type is one of "Academic" (for work that'll fetch me grades), "Work" (for work that'll fetch me joy or money), and "Growth" (for work that'll fetch me knowledge). The tasks include homeworks, labs, upcoming tests, work assignments (I grade homework for EECS 16A, so I note that on my weekly Notion), prep work (I'm a lab assistant for CS 61A), and personal goals such as learning a new web development technology or watching ML videos, or working on my Guide to 61A.

And that's effectively my entire setup. It's comprised of a pretty sizeable variety of technologies, but I kind of like the way everything works and it's pretty easy to replicate for other classes. The transition from 61A to 61B was pretty seamless, and the transition from 16A to 16B was barely a transition at all. The only course I had to setup for anew was EECS 70, but now that that's ready to go I could probably reuse that setup in classes such as CS 170 or CS 182.