🪴

field notes of a new developer

(seed planted — oct 2024)

←back

This is a running log of all my notes on my path to become comfortable in software development as a Product Manager. My main goal is to be able to think of an idea, mock up, and build something fully integrated (end to end with databases) quickly and in clean code to aid in communicating my ideas as a PM. Also to gain a deeper understanding of implementation details, how something is built, and to speed up the process of shipping my own vision or iteration of a thing. I don’t want this to distract or take away from my primary goals of bringing value as a PM, but to make me more effective at what I already do regularly on a development team.

I’m going to lovingly call each section in this running document a rabbit hole, which marks the start of some ambition (try to build this thing, learn that framework or tool, understand this principle) and all the interconnected ideas and learnings that had emerged out of that. My purpose for documenting this journey is to list the structures at a level of abstraction which could sprout new nodes for learning. It’s also to prove that anyone with a “non-technical background” can learn absolutely anything they want.

Guiding Tips

  • My primary IDE is Cursor and I recommend it to anyone who is also new to coding and development. Besides speeding up the slog of understanding file structures or certain functions, I find the copilot aspect ( ❤️ Claude 3.5 Sonnet ❤️) incredible to lean on for support throughout one’s learning. Think of it as having a tutor as you’re building. Cursor to me, acts like a coding dojo for all the projects I am most interested in building.
  • Try to get access to your company’s GitHub repository if you don’t already have it. This unlocks a whole new layer of learning and connection bridging as a PM, especially when you study the files of the code that make up the product(s) you are responsible for.
  • Search up the developer centre resources in your company. Read all getting started/bootcamp material and what an associate developer or intern would be doing in their first month at the company. Know the stack. Ask a developer friend to help you get your LDE set up to mess around in a contained way. This will expedite your learning 100x (especially with having Cursor to ask questions to about the entire repo and dependencies).
  • Find a Zettlekesten or writing system that works for you (you will need one) and habitualize the art of note taking. I use Obsidian to document all my technical conceptual notes. I like Obisidan because everything saves as a markdown file. This opens up possibility for creating a structured database of your notes to do interesting projects in the future. For example, when I learn a new concept I will create a new file (ex. “CI/CD”) and list out all of my notes within the content area of the file. Historically I have also really liked Anki for spaced repetition, but Obsidian kind of covers that naturally in how files are structured in the UI.
  • For reference papers, blogs, tutorials, or other helpful documentation that you want to make — download copies and mark-up, highlight, and write the most key learnings to extract for your notes. Especially in ML that is so research-heavy, I love to save interesting papers and create my own notes on top of these documents. Everything from those papers becomes it’s own file. I also keep a running export of all the important bookmarks of those various gems of sites or repositories that I will come back to and make notes on.
  • Always have actual paper handy as you’re learning too. My general workflow is to have a blank sheet of paper for every new rabbit hole or endeavour and to simply jot list all of the play-by-play progress and insights I make (which you will see below in each rabbit hole section). I also create diagrams and drawings by hand and then I will take a picture and upload these directly into my notes. Or, I digitize flows and architectures using Excalidraw after. If you have a tablet that probably makes things easier, but I don’t.
  • You will surprise yourself with how much you can learn in just one 25 minute Pomodoro session. It’s all about the little wins and small progress. Remember, your career is a jungle gym and the learning you do on the side helps to unlock different varied levels and keeps playing fresh. You don’t have to grind it out and burn yourself. Besides, you will never know it all and that’s okay.
  • Have the spirit of treating this learning venture as continuous intentional hackathon projects or deliberate practice, where you break down a task into different “skill chunks” representing areas to model mentally. I like to treat every module or rabbit hole below as one and ritualize coming in to learning. It also frames my orientation and attitude to the relationship I establish with my computer on the weekends. I love telling myself that this weekend I’m building and hacking away vs. studying. I don’t know, it makes it fun and it feels good. I’m all for tricking my brain if it means the flow state is more likely to emerge.
  • Don’t be afraid to show your work. Go ahead and make that messy repo public. Create a simple case study and landing page for the little thing you put together. This is how you garner feedback on what you’re doing and also showcase your niche interests and growing skillset. Fuck perfectionism.

Rabbit Hole 1: Setting up LangGraph for agent workflow observability

  • While attempting to set up my IDE, I needed to install LangGraph and LangStudio onto my local to create a simple agentic workflow. Following this tutorial, I went down a rabbit hole of trying to understand the individual pieces of code before accepting Cursor’s changes.
    • Came across a principle called Design Patterns, which I initially thought had roots in visual design, but these are more for software engineers to have models for setting up, refactoring, or creating well written code aligned with principles in Object Oriented Programming (OOO).
    • OOO provides a paradigm in programming to follow based on the concept of “objects” (which contain data and code (data in the form of fields, attributes, or properties; code in the form of methods or sets of procedures).
  • I started going down a rabbit hole on JavaScript syntax and found Mozilla’s documentation. I started with basic basics, like getting started with the web.
  • Went back to LangGraph, installed my API keys for OpenAI and Tavily.
  • Ran the program and got weird errors in the console — stuck in some loop.
  • Downloaded LangSmith for fun, got strange errors suggesting I needed Docker.
  • Downloaded Docker, began briefly learning about containers.

Rabbit Hole 2: Docker and Service Templates

  • My friend Jeremy gave me a crash course on setting up the LDE at my company, and a very high level architecture of all of our main application services, and how Docker comes in to play:
  • image
  • I found this Docker Roadmap to help provide more structure with this learning.
  • Docker (a platform as a service product) uses OS-level virtualization to build, test, and deploy applications into isolated environments called containers. Within these containers are the packaged code and all their dependencies to run reliably and quickly from one computer to another. Containers use an isolated stored filesystem that is provided by the container image.
  • Containers are extremely important as they solve the issue around inconsistent environments when working in large teams. Before containers or virtual environments, a lot of issues and time loss was caused by having to install and configure local environments to build projects shared by co-workers or friends.
  • Docker Image:
    • An image is a read-only template with a set of instructions on how the Docker container is created. The docker build command on your local will allow you to build your own images after you’ve created or obtained a Dockerfile for the image.
  • Docker Compose:
    • docker compose is a tool to help you define multi-container applications. You create a YAML file (or retrieve one) and use the single command docker compose to pull the images and start up services or tear them all down.
  • Starting Docker containers:
    • docker create will create will manually create each container, and docker start on top of each will run the created containers.
    • However, with docker composer you can create and start containers easily and don’t have to have the Docker images pulled in (it will do it for you).
  • Service Templates came up as a topic in one of my meetings today
  • This video on how to set up local devops environment with Docker using Dev containers is useful: https://www.youtube.com/watch?v=XTfIVffnapo

Rabbit Hole 3: LDEs and LLM Agents

←back