Stop reading and solve a real world ML problem

One of the best ways of learning comes from solving a real world problem. A machine learning colleague suggested I solve a real world problem that I was facing using machine learning. My mind was drawn to a problem on the road where I live. Many drivers drive too fast down the road in the evening. I wanted to raise awareness to the police about how fast these vehicles were going. 

I created a github repo with the work. Please take a look, and https://github.com/amplifiedengineering/opencv-radar. The following post is about the process I did to come to that solution.

My first approach was to find a LIDAR sensing device to measure the speed of the vehicles, and capture the license plate information through a camera. As I began researching LIDAR devices, I realized some of the less expensive models were custom built for a specific purpose, for example this devices’ spec sheet shows it does a single reading which is built for measuring the depth for drones to avoid ground collisions. That wouldn’t help me in my tracking, where I need to be able to measure multiple targets potentially (two cars going the same way, or two cars going different ways). 

As I was describing this to a friend who is into robotics, he suggested a different approach. Why not measure the speed using video? I liked this approach, as I could record video from my iPhone, without buying expensive single use hardware, and then run the calculation using software. As I started thinking about how to solve the speed calculation, it seemed straightforward: have a set of lines on the video that mark a well known distance. Then calculate the speed based upon the number of frames it takes for the vehicle to transit between the two lines. 

Speed (miles per hour): miles (distance in feet / distance in feet of a mile) by hour (total # of frames * frames per seconds * ( 1 / seconds per hour )

To be specific, I traded off real-time video processing for using post-processing. So, this approach wouldn’t work for all applications, but I was more interested in grabbing a video file from my phone, doing post processing and finding how many people were speeding. This way, I didn’t have to worry about the frame rate causing a queue to develop in the stream (which can be solved by sampling frames rather than processing each frame).

The first problem was detecting where the vehicle was in the image. I knew about the openCV library, so I started down a path on exploring this. I used a Haar classifier to detect the cars and experimented with multiple different hyperparameters to tune the detection of the cars and trade of the # of frames per second I could process using detectMultiScale API. Some of the key trade-offs here were the size of the video frame to be processed (the smaller the faster the processing, but the less ability to detect), the scaleFactor (API), and the minNeighbors (API). I played around with how much I would resize the greyscale image of the video frame before passing it into the detectMultiScale API. It was working “ok”, but I noticed that there was a bit more choppiness (jumpiness) in the object detection borders, so I looked for a way to improve it. 

I found this blog post informative. It uses Haar classifiers with background averaging to detect the differences in pixels and then creates bounding boxes on those detected contours differences from the background. This again improved the performance slightly. However, I was still seeing very unstable bounding boxes around the cars, which left me wanting a more stable detection mechanism.

Finally, as I was talking with another principal level developer about an unrelated topic, he was sharing about some work which he had done using OpenCV and Yolo. I decided to look up Yolo. I was impressed with the improved stability in object detection and similar performance. At first, I was a bit disappointed that the Yolo architecture requires a color image, I was previously using greyscale (with less channels used in inference I assumed it would be faster). After that I discovered that the architecture would also do all of the resizing for you when you did inference, and that the previous resizing I was doing was superfluous. Finally, I modified from using the v3 predict function to find the objects to the v8 track function

Figure 1: setup screen to verify the start / end lines for video

Figure 2: tracking cars using the YoloV8 track API function, with tracking trails

Hope you enjoyed the ride. A few potential improvements which I’m thinking of now, detecting the speed based upon well known sizes and distance (specifically I could use license plate size), and ability to collate together multiple views to tag a higher resolution view of the license plate.

“founder mode” – a simple rebuttal

Paul Graham – I’m not buying what you’re selling. Why are you asking us to suspend belief that management doesn’t work and only founders can lead companies to success?

I read through the founder mode blog post, and it left me profoundly sad. Sad? Yes, because Brian Chesky, at least as Paul Graham portrays the talk (I can’t seem to find a video of the talk anywhere), is bucking conventional wisdom to avoid managing and advocating for more of a hands-on approach as a leader. The so-called ‘conventional wisdom’ they disguise is that this advice doesn’t scale and leads to worse outcomes. Propping up “founder mode” as the next great leadership style is a fool’s errand.

I’m sad because Paul seems to selectively forget success cases for non-founder run companies, e.g. Microsoft (Satya), Apple (Tim), Amazon (Andy). These are not small companies with a combined market cap of ~$8 T. That’s $8,000,000,000,000. What are these “manager mode” companies doing from which start-ups could draw inspiration? Obviously, the above companies have been successful, what is the logical basis for this argument?

The key failure in logic in the argument of “founder mode” vs “manager mode” is conflating a company being “run into the ground” that conventional management simply doesn’t work. Looking deeper, a great manager will dissect and investigate why. Is it an easy process to investigate what’s broken? No. However, building a company whose success is inextricably bound to a particular leader (founder mode) is super dangerous (especially to shareholders).

The danger of relying solely on a single leader highlights the need for robust systems that transcend any one individual. A successful way to ensure smooth operation in business is creating auditing mechanisms to roll-up status and risks in various business units. These recurring auditing events help leaders to stay informed and ask questions to tweak execution (a project is taking too long, or is going off the rails) and act as a forcing function to hold the business leaders accountable to the reporting and risks. Unfortunately, it takes courage to hold people accountable. 

A case study, when I worked at Amazon, there was great company lore around how Jeff Bezos would show up to six-page review meetings. He would allow the least senior people (after reading for 20 mins) to give comments on the doc before asking his questions. This gives oxygen for other ideas and sets an example that Jeff isn’t the most important person in the room. Jeff Bezos, at Amazon scale, couldn’t possibly dive deep into each business frequently. He was able to scale and trust leaders by establishing mechanisms which improved the successful outcomes (e.g. six pager reviews and operations / budget planning). Examples of great successes that have been driven through the six page process are Kindle, Amazon Prime, and every Amazon product which has launched since 2004. These documents because of the rigorous review process drive clarity of thought in the decision making process of what to build for the customer, how and why.

The success of Amazon’s structured approach raises a critical question: why then, should we rely on the singular vision of a founder when a well-designed management system can achieve so much more? Why am I skeptical of “founder’s mode”? Because I have worked at companies where the founder was deeply entrenched in “founder mode” philosophy. Every new product idea and innovation had to pass through this founder. Being the single decision maker and hands-on certainly didn’t improve the outcomes because the company still struggles to this day. 

A more nuanced thought around “founder mode” is whether companies are creating the right structures (and mechanisms) to succeed even in the absence of their founders.

Pragmatic & predictable notebook using Python environments

Going through the second half of the course of fastai, I was running into problems running the notebooks. I am relatively new to Python package management, and so some of the very cryptic error messages baffled me on how to resolve. 

An example

When trying to run the notebook #9 (may have failed earlier) from part 2, I got errors around NoneType object not being iterable when getting the data back from the dataloader. I was trying to ensure that I had the correct versions of libraries installed, so I went to the terminal window and tried a pip3 install of pytorch libraries, but then that would give this error:

× This environment is externally managed
╰─> To install Python packages system-wide, try brew install
    xyz, where xyz is the package you are trying to
    install.
    
    If you wish to install a Python library that isn't in Homebrew,
    use a virtual environment:
    
    python3 -m venv path/to/venv
    source path/to/venv/bin/activate
    python3 -m pip install xyz

First, I realized after much searching on the internet that the above error message is a passive way (if you wish to install a library) of indicating that you should set up a separate Python environment where you can have specific libraries installed.

Second, I have installed some newer dependencies than what the fastai course expected (torch version needs to be 2.0.1 and numpy needs to be less than 2). So, I needed to have those legacy versions installed to run the fast.ai code. (example python3.12 is installed on my machine which is incompatible with torch 2.0.1).

So, I was wrestling with how I can specify those specific versions in the Jupyter runtime. Python environments help resolve this issue. The premise of Python environments is that you can independently manage all of the library versions for a particular environment without destabilizing other Python libraries you may need access to. You can think of it as a container which allows you to install specific versions that are only available within that container.

However, I had never worked with Python environments before, so I had to learn that. They are pretty easy to do (step 2 is an example below). I was able to isolate all of the package versions using the Python environment so that I could independently run the notebooks without additional problems. The steps below allowed me to do that.

figure 1: how to Python env allows you to target specific libraries

Solution

Steps to get a running local notebook (Macbook) for fastai/course22p2 in the Github repo:

  1. Get Python 3.10
    • brew install python@3.10
  2. Create a virtual environment which is python3.10 based
    • In the terminal window run
      • python3.10 -m venv .fastai2
      • source ~/.fastai2/bin/activate
    • Note: this creates a virtual environment from which you can install pre-reqs which could be incompatible with the currently installed default python version. For example, pytorch 2.0.1 is incompatible with python3.12.
  3. Install the pre-reqs (in terminal using Python env)
    • pip3 install -Uqq git+https://github.com/fastai/course22p2
      1. (Installs all of the miniai components created in earlier notebooks)
    • pip3 install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 
    • pip3 install matplotlib
    • pip3 install jupyter
    • pip3 install numpy==1.23
  4. Run jupyter (in terminal using Python env)
  5. Launch colab in browser
  6. Run the cells in the notebook, voila!

I hope this helps someone save time from figuring out these dependencies in the future.

Prioritize or Perish: The Ultimate Guide to Time Management

The greatest superpower anyone has in this day and age is disciplining their attention and use of time. Time management is the skill that differentiates people who achieve their goals from those who don’t. The key skills to learn for great time management are identifying, prioritizing and executing tasks. Since this particular post is targeted towards employees newly entering the job market, I will focus on the last two prioritizing and executing. Once you have mastered the prioritizing and executing skills, moving on to identifying and exploring new potential priorities will make you unstoppable. The process of identifying tasks will be covered in a subsequent post. 

First, we’ll start with the Eisenhower matrix. This matrix is a great tool to help you understand and prioritize what to work on. 

   Urgent   Not Urgent 
  Important   1 – do   2 – schedule 
  Not important   3 – delegate   4 – delete 
Figure 1: Eisenhower Matrix

Every task should fit into one of the four quadrants:

  1. Is it important and urgent? Do it.
  2. Is it important, but not urgent? Schedule time to complete it.
  3. Is it not important, but urgent? Delegate it.
  4. Is it not urgent and not important? Delete it (don’t do it)

Some excellent books which gave some great nuggets on time management: 

  1. Seven Habits of Highly Effective people
    • Habit #3: Putting first things first means organizing and executing around your most important priorities. 
  2. Getting Stuff Done
    • Write a list of specific things you want to accomplish to get it out of your head. E.g. Write next blogpost draft on time management skill. 
  3. Checklist Manifesto
    • Checklists provide discipline, and discipline makes success possible. 
  4. Deep work
    • “The key to developing a deep work habit is to move beyond good intentions and add routines and rituals to your working life designed to minimize the amount of your limited willpower necessary to transition into and maintain a state of unbroken concentration” 

Each of these books circle around a theme of discipline around writing down and prioritizing what you should be focused on. I have synthesized the advice into three key skills to master. 

These key skills are: 

  1. writing everything down which you need to do (I.e. organizing or identifying tasks) 
  2. prioritizing tasks  
  3. executing tasks in prioritized order 

Make a list, prioritize, and execute. Repeat. 

1) Writing everything down  

If you aim at nothing, you will hit it every time.

Zig Ziglar

Let’s take an example, first write down everything that you need to prioritize over the next week. Here’s an example list of my tasks: 

0. Finish draft of time management with focus on prioritizing and executing 

  1. Drop off Leaf for repairs at auto-body shop (Mon) 
  2. Drop off Dad @ airport (Mon) 
  3. Clean-up
    • Clean desk 
    • Vacuum desk area 
  4. Training
  5. Network
    • Go through list of previous contacts (Google sheet) and schedule three informational interviews (follow-up on potential introductions) 
  6. Prepare for interviews (obfuscated company names to variables to avoid exposure)
    • CompanyX – interview Tuesday 
    • CompanyY – interview Thursday  
    • CompanyZ – interview Friday
      1. Each of these contain subtasks around looking up people I’m meeting with exploring their business, preparing questions for the interviews, etc. 
  7. Call Rightway pharmacy (re: compounding prescription re-imbursement) 
  8. Check stock market once this week 
  9. Read through Twitter feed for 30 mins max 
  10. Engage with a couple of posts on LinkedIn for 30 mins max 
  11. < Personal family / friend related priorities > 

The most important step in my week is cataloging what things need to be done. When I was younger, and had less responsibilities, it was easier to juggle all of these tasks mentally. However, as I grew in responsibilities (more kids, employees, job responsibilities) there was an inflection point where I realized the lack of an organized list was hurting my impact. I would focus on whatever I wanted to at the moment, and sometimes that was the wrong thing. Focusing on the wrong thing is easier to do when you don’t have a list. Alternatively, I would prioritize interrupt driven requests without weighing it against my other weekly priorities. At the end of those weeks, I would look back retrospectively and wonder where all my time and energy had been spent, and what impact I had to show for it.  

2) Prioritizing tasks 

The second most important step when making the list is to prioritize it according to the Eisenhower matrix. Here’s an example of bucketizing my items:  

  • Urgent & important – items 0, 1, 2, 6 
  • Not urgent & important – items 4 & 5 
  • Not important & urgent – item 3 & 7 
  • Not important & not urgent – item 8-10 

Note: I added items 8-10 as an example of areas where I personally struggle with setting boundaries.  

Note 2: item 11 is expanded on the longer list, and this particular week had many additional family responsibilities that aren’t normally present. 

Of course, just because you can identify some items as delegate in the matrix, doesn’t mean you have the means or have the time or emotional overhead of delegating the task. For example, task 3 (clean-up) although it’s categorized as “not important” and “urgent”, my wife and kids wouldn’t necessarily take kindly to me asking them to clean up the mess I made at the desk. So, what do I do with those tasks? I call these filler tasks. I fold these filler tasks into my week when I’m feeling less motivated to do a more thought or focus intensive task. Completing some of these tasks and checking them off can significantly boost my motivation and help defeat procrastination.  

Having a deadline associated with tasks, will give you the proper focus to ensure that you avoid doing non-important tasks. For example, I know my dad’s flight leaves on Monday morning, so I schedule time for “drive dad to the airport” on Monday morning in my calendar. I’m sure that my dad appreciates that I focused on dropping him off at the airport on Monday, rather than waiting to bring him to the airport on Tuesday. Additionally, having this context will help you to order similar tasks. For example, the interviews with the companies (X, Y, and Z) were actually on Tuesday, Thursday, and Friday, so I needed to focus on preparing for X first, since it was on Tuesday. Getting that order incorrect would have left me unprepared for the interview. 

People think focusing is about saying yes to the thing you’ve got to focus on. But that’s not what it means at all. It means saying no to the hundred other good ideas that there are. You have to pick carefully. I’m actually as proud of the things we haven’t done as the things I have done. Innovation is saying no to 1,000 things.

Steve Jobs

3) Executing tasks in prioritized order 

It can be helpful to have a strict ordering of the tasks on your list.  This will allow you to focus on only the next highest priority item on the list and avoid getting to the end of the week without a critically important task done. I am less rigid about this strict ordering, just because I know how I work best. I like autonomy to choose what I’m working on next instead of having a schedule dictate what that will be. Some days I will wake up and I have to coax myself more into getting into the zone of work. This may mean that I focus on getting a couple of the filler tasks done as a warm up to the more difficult tasks. This is the exact opposite advice which Cal Newport gives in Deep Work, where he suggests putting the most difficult task first in the day. However, I know what works well for me, and sometimes that is a gradual easing into the Deep Work.  

It’s important to focus on the priorities of the tasks when choosing what to work on next. 

Allowing less (or not) important (urgent or not urgent) items to choke out your ability to focus on important items will stifle impact. Distractions impact everyone in this era where every app and device is vying for our attention. Some of the most successful people that I know are ruthless in training their focus on executing tasks in the important row (see Eisenhower matrix). A negative example, a newer employee Bob would spend a lot of his time on his cellphone texting with friends during the day. While this isn’t a problem for some people, sending a one-off text, or doing it during lunch time. Bob would become absorbed in these conversations and spend hours on his phone, texting with friends, and it was impacting his ability to prioritize and get his work done. I noticed this lack of progress when he shared during daily stand-up. In private I asked him to measure where he was spending his time. This insight led to an important break-through (I’m spending too much time on not important / not urgent tasks, i.e. texting friends) for the person in time management and impact. *  

* Note: – An insight I learned when doing performance optimization in software, you have to measure where the time is being spent with a profiler, I.e. you can’t guess. You can try to guess where the software is spending time, but you will often be wrong. As an example, at Microsoft, I found logging boilerplate in a large service codebase which I worked on was doing stack trace calls to determine in which file it was making the request to log the filename. The stack trace call in C# is expensive because it uses reflection, so I just added the file name logic to be statically built. I would never have guessed that it was the stack trace call that was eating up so much of the compute without measuring it! 

Today, there are many ways to observe what you’re working on. The simplest is setting a fifteen minute timer which goes off throughout your day. When the timer goes off, immediately write down what you’re doing (even if it’s not work related, e.g. searching for a product on Amazon), and then go back to whatever you were doing. After a few days of observation, you might observe a pattern, like Bob, who discovered he was spending a LOT of time on his phone. (There is now tooling support for this measurement: Toggl

There are various reasons (ignorance, lack of discerning priorities and impact of tasks, being interrupt driven) for folks having trouble with time management. However, knowing what to do, when it should be done, and in what order they should be done will help provide the structure and the motivation to say no (especially to things outside of the urgent / important bucket). Giving yourself the permission to say “no”, to good, but not the best things will help you to be more effective and intentional in your impact. 

FAQs:  

What happens when a new request comes in from your boss? 

Part of the power of having a prioritized list that you are working towards is allowing that list to help you say no. After putting the task through the Eisenhower matrix, you can take the new task and measure to see where it compares to your other items. If it’s being asked of you by a manager, it might be worthwhile to have a trade-off discussion with them about what you planned to work on that might be impacted by the new request. If it doesn’t make the list, consider adding it to your next week’s priority list, or better yet seeing if it can be deleted. 

What about recurring items? 

I try to put all recurring items on my calendar. This avoids me having to think about them, and gives me greater confidence when scheduling meetings, etc. If I have to take my daughter to/from soccer practice, I put those commitments as a recurring meeting into the calendar to help me remember to do them, and then also keep the list to a manageable length. 

How do I improve my discipline in creating, prioritizing and executing against a list? 

Start off slowly, you don’t have to do it perfectly and capture all the context the first time. Create a list with a few items, prioritize and execute. Repeat this regularly over the next two months. Revisit what is working well versus what is not.  

Great Expectations: Not just a Dicken’s Tale

Disclaimer: What you don’t know, can hurt you.  

My expectation for you, as the reader, is that these guidelines will help you to take a more intentional approach to both setting and clarifying expectations.  

Clarifying expectations – What do I even need to do? 

When I was a new manager, I had an employee who was relatively new to the workforce. I will refer to them as Wally, not their real name. I had the expectation that Wally would be able to deliver on engineering tasks which another team needed done. The previous manager had not stated the person wasn’t meeting expectations as part of the transition. As the project was executing there were clear signals (to me) that this employee wasn’t meeting expectations (e.g. not giving status updates on progress made, not treating the project with urgency). This was clear to me, but not clear to Wally. What was the gap? I hadn’t set clear expectations with Wally (e.g. you need to send updates on your progress to stakeholders daily) and the other team’s lead. A couple weeks in, and I was having an expectations conversation. This is the challenge of expectations. My expectation, which was implicit is that a person should understand the importance of proactive communication and execute as quickly as possible on a project. 

Expectations – they’re everywhere! 

Expectation [ ek-spek-tey-shuhn ] – n. 1. a belief that someone will or should achieve something. 

Each job that you will hold in your life will come with expectations. Some expectations will be written down (explicit), most will not (implicit). Your job as an employee is to understand these expectations, the spirit behind them, how they apply to your role, and meet (and hopefully exceed) these expectations. 

Why are expectations so important? 

Expectations make and break relationships, this includes work relationships. Think back to the last person who consistently didn’t meet your expectations. What happened to that relationship over time when that person consistently didn’t meet expectations? 

As a manager, your role is to provide clear expectations to employees on how to be impactful and grow impact over time. Clear expectations are good, because the context in the expectation helps create enough structure for an employee to understand how to be successful.  

So, how do you hone your expectations: 

  1. Ask your manager –
    • your manager should have clear expectations for your role and level at the company. At larger companies some of these expectations are generalized for your role and level as a leveling guide or career ladder document. Whenever I have a new employee start on my team, I first ask them to read through and evaluate which areas they have demonstrated for their role and level, and identify where they are exceeding, meeting, or not demonstrating areas. This identification of not demonstrating an expectation is not punitive, but rather to illuminate which areas we can focus on demonstrating in the future (I.e. setting up goals). 
  2. Align to written current and next level role expectations
    • Expectations for a more senior engineer may have statements like the following: “autonomously deliver large-scale and ongoing business impact across a team, product capability” 
    • If they have been in their current level for a sufficient period of time, I ask them to look at the next level expectations and do the same identification (exceeding, meeting, not demonstrating). This can then feed into promotion readiness discussions. These role and level expectations merged with business needs should result in a goals-type document.  
    • A couple of clear examples:  
"In order for our team to scale successfully in the next quarter, I will interview 2 candidates a week, providing written feedback which clearly articulates where they are meeting / not meeting the rubric for the role / level" 
"I will execute the XYZ project as the technical lead and launch it by end of Q3, this will involve me working with the profile, search and detail page teams (both mobile and backend), aligning on a design, running status update meetings (to identify risks), and send stakeholder update emails"   
  1. Align to unspoken organization norms
    • observe others who are successful in your role (at your company or in your org) – the hardest expectations to meet are unspoken (unwritten) ones. A company may have a strong set of principles that define behaviors which are rewarded, e.g. Amazon LPs. 
    • These principles though can have different priorities depending on the organization or leader. So, what is defined as a principle for the company may not be the prioritized principle of the organization or leader. Let me give a specific example, as these leadership principles (LP) have some tension built into them that isn’t always apparent. The principles of deliver results and insists on the highest standards can be at tension with each other. If you are in a v1 product team where time is of the essence to launch the product, deliver results (getting it done) may be prioritized over insists on the highest standardDeliver results then will be rewarded as compared to someone who might demonstrate insisting on the highest standards (with less results delivered). If you are having difficulty these unwritten expectations or what is rewarded in an org, find one of the influencers / strong performers and ask them for what are the most rewarded behaviors. 

How are they used by your manager? 

Expectations are a tool like anything else, to facilitate alignment between your manager and yourself. When you have strong alignment on expectations (and goals) with your manager, and then you execute against those expectations well, trust is built. Notice, I didn’t say that rewards would follow, that doesn’t always happen in the immediate term as the impact of the project might not turn out to be as big as anticipated, etc. (More on that in a later blog post.) However, trust is the lifeline of employee / manager relationships. The converse of not meeting expectations doesn’t necessarily result in performance management and end in termination, but in loss of trust.  

Why is trust so important? 

Many times, as a manager, I need to assign a big project opportunity and more often than not, I give those opportunities to an employee who has earned my trust. So, by not meeting expectations, and therefore not earning my trust, the employee is losing out on the opportunity to own a critical project. A specific example: imagine there is a two week timeline to deliver a feature, should I give the project to someone who I know will own the project and unblock themselves to meet the deadline, or a person who might have equivalent experience, but makes excuses of why things aren’t able to get done (e.g. too hard to do in an unfamiliar code base)? The question seems rhetorical, but the decision making for the above situation is something which managers face all the time.  

How do I build trust in an ambiguous situation?

As a manager, I have learned through the years that my leaders can’t read my mind. So, how do I manage the situation of discerning their expectations? (this applies to most senior level folks as they need to identify the most important problems to solve)

Over communicate. When I have a new manager, I turn up my verbosity level, as I tend naturally more towards terseness. I demonstrate how I think by writing the following: context of the problem, potential solutions and trade-offs, (if I’m not solving it individually) how I am coaching someone else through solving the problem, and when we should have enough information to move forward with executing. I then share that doc with my manager.

Why do I do this? I’m not looking for approval from my new manager, I’m looking to provide my manager with enough context to show them how I am thinking through the problem in order to develop trust. By over communicating in the two to three months after joining a new manager, often I find this develops a strong amount of trust which leads to greater and greater autonomy for me and my team. Additionally, if there is some failure of logic in my thinking or some missing context, they can provide that, and I can learn about those hidden expectations from them.

I liken this approach to showing your steps for math problems in school. Two people can have the same correct answer, but the teacher may grade down one of the students’ homework or test, because they didn’t show the work. They didn’t articulate how they came to the correct answer, so it could have been luck.

What should I do? 

Think about a few of your work or personal relationships. Ponder expectations that you have of the other person, and what expectations they might have of you. If you have a close enough relationship with them, ask them if your expectations assessment is accurate (are you missing any?). The results could be unexpected, and help you grow.  

Easy (best) instructions for enabling local AI development on mac.

Setting up SSH tunnel from mac to PC

Colab has security measures to prevent you from putting in any IP address in the Local Connections Settings dialog. These instructions mention that you can use gcloud command to point to a different machine using local port forwarding. However, it doesn’t show you how to do this for a mac to window set up (and maybe you don’t have gcloud installed). So, if you have a Windows PC with a GPU that you would like to run Python notebooks using colab on your mac (macbook), simply follow these instructions below:

  • On Windows PC (Win 10 or 11)
  • On Mac
    • Create ssh key (if you don’t already have a SSH public key which you use)
      • ssh-keygen -t rsa -b 4096 -C “<emailaddress>”
      • Should generate a public / private key pair in ~/.ssh (id_rsa and id_rsa.pub), the latter file is the public key
  • On Windows PC install
    • Copy ~/.ssh/id_rsa.pub (from Mac) to %ProgramData%\ssh\adminstrators_approved_keys (on Windows)
    • Set up permissions for administrators_approved_keys file
      • icacls administrators_authorized_keys /inheritance:r
      • icacls administrators_authorized_keys /grant SYSTEM:`(F`)
      • icacls administrators_authorized_keys /grant BUILTIN\Administrators:`(F`)
    • Restart openssh server through services or command line (net stop sshd & net start sshd)
  • Startup Jupyter on Windows
    • Type jupyter lab in a command prompt
    • Copy localhost connection string with token (starts with https://localhost::8888/lab?token=<token>)
  • On Mac
    • Start SSH tunnel
      • ssh -L 8888:localhost:8888 <windowsAccount>@192.168.1.xxx
    • Start up colab instance in browser
      • Click on “connect to a local runtime”
      • Paste in localhost connection string from above
        • Pro tip: I use google docs to share context across machines.
  • Troubleshoot
    • ssh -v or ssh -v -v -v (connection issues)
    • nc -z localhost 8888 || echo “no tunnel open” (test for liveness)

5 habits of highly successful learners

We live in the information age. The amount of information available through print, audio, and other mediums boggles the mind.  How to deal with this much information is a perplexing problem. It is especially pronounced for the so-called information worker. Being an information worker myself, I realized many years ago that I won’t ever be able to learn everything that I want to know. This conundrum surfaced when I tried reading one book a month, only to find that I wasn’t retaining the information after I finished reading the book. I found myself wondering, “If I’m not retaining what I am reading, what’s the point in reading the book in the first place?”

This started me on a journey of self-reflection in order to discover how effective learning takes place. Since learning usually takes place unconsciously, I had to think of how the largest lessons were learned and the most impactful moments of change happened in my life.

One such memory comes from when I was 9 years old. I was focused on learning a difficult piano piece. I slowly repeated the finger movements, and this repetition seemed to transfer the song to my memory. This technique resulted in me giving a recital of the entire book of songs from memory. Another example from a US History class came to mind. I read the textbook and wrote down key dates and events in a chronological timeline. When the test came, I could visualize the dates and aced the test. Making a visual representation helped the information to organize itself more clearly in my mind and helped me retain it better.

Entire books have been written addressing learning styles. I have read about learning styles, and even read (and retained) erroneous information regarding them. As I was writing this article, I recalled something written about a “cone of learning”, which had percentages of information retained by the activity involved. The cone showed that when reading you would at most retain 10%, as compared to teaching the information, which resulted in retention of up to 90%. Further reading discredited the “cone of learning”; the percentages are fictitious (1 and 2).

I realized since this cone of learning is fictional, I needed to look for non-fiction examples of habits that when followed led to success in learning. So, of the things I found from my observations of other successful learners as well as lessons from my own experiences, these are 5 habits of highly effective learners:

Be receptive to feedback – how willing am I to listen to others?

At the root of the ability to learn is the question, “How teachable am I?” If you believe yourself to be the brightest person in the world, your field, or your workplace, and that no one can teach you a thing, then you’re right: no one will. However, if you’re willing to set aside your ego and embrace a humbler view of your abilities, you will be open to hear what others have to say, and more apt to learn. For example, in one of my groups at work we were having trouble with two teams not coordinating well. As part of a retrospective on the problems the teams were having, one of the senior engineers on the other team pointed to an example of some language which I was using in our status updates to our director. They included phrases like, “We’re blocked by the team X on functionality Y.” He suggested that the word “blocked” was divisive. He felt that the wording made it feel like I was blaming the other team and I should use more inclusive language, such as “we are working with the other team X to address the issue with functionality Y.” My ego was bruised. I could have easily dismissed this feedback as nit-picky. After all, was this really a problem with me, or with how he chose to take the phrasing? In the end, I chose to change my behavior and learned the importance of the words I used. I concluded that it should be relatively straightforward to use collaborative rather than divisive words to describe the situation. I chose to listen to the feedback, incorporated the feedback in my descriptions, and earned trust with the other team by not dismissing them. A person with a humble attitude seeks to learn from others.

Be focused on the end goal – how will this subject change me?

How many times have you read through some business book and realized as you were reading it that it lacks immediate application? In fact, when you are reading a book, how often do you question what your motivation for reading it is to begin with? It is important to identify your motivation for learning before approaching a new subject. Identifying motives for reading a book on a new subject will give you forward momentum while studying.  When I joined Amazon, I wasn’t able to clearly communicate my thinking in writing. The reading culture at Amazon favors written narratives that are shared (and read), as opposed to other workplaces where verbal communication is key. So, I was able to identify a motivation for improving my writing: understanding the cultural requirements for success at Amazon. My boss worked with me to generate better narratives. He would ask questions about context and details and demand that my written communications be crisp (concise, with proper detailed data). I learned from that experience, and became a better writer. As a counter example, I have desired to start my own business. So, I picked up a book on small business development (“The E Myth Revisited” by Michael E. Gerber for those curious). I tried to read through it once… but could not. My motivation for reading the book was poorly matched to its subject matter. I wanted to know: what do I need to know to start a business? The book was for a person who had already started a business, but was struggling and needed guidance. It wasn’t a good fit for my motivation at the time. So, I put the book down … for now. 

Be disciplined – how do I approach learning?

Novice learners can take an undisciplined approach to learning. Before anyone takes offense, I should make clear that I have frequently approached learning in an undisciplined manner. What do I mean by undisciplined? Here are a few anti-patterns I have experienced:

Not considering deeply what you’re learning: You may learn some things by osmosis, like language, but if you’re trying to learn a new mental paradigm you need different structures. Are you expecting that you will learn? Are you reading the book as you read a novel or watching the video as a movie?  Are you taking notes on what you learn? Are you sharing what you have learned with others?

Not having an immediate application: This relates to the earlier point on motivation, but differs in how you apply what you’re learning. I think about learning as a just-in-time activity, meaning that, when I need to learn a skill, I quickly ramp up on that skill. Likewise, when I have learned a new concept, I need to immediately apply it, or I will often forget. Are you applying what you have learned, and in a timely fashion? (More on this in a minute.)

Trying to learn when you’re tired: I find that there are times where I can apply myself to learning, and other times that trying to learn is, in fact, counter-productive. Are you trying to learn when you’re tired? Have you noticed whether you increase your retention by getting some good sleep after trying to absorb new material?

Be courageous – how willing am I to be bad at something new?

In order to learn, you will fail. There’s no tip-toeing around this fact. If you don’t know how to do something, you don’t know how to do it. It’s as simple as that. When you first attempt to do something, you generally will not be good at it. This is where you need a growth mindset in order to learn and blossom. This isn’t just for learning subjects in which you don’t have any experience: e.g. piano, fencing, or archery. It has to do with subjects where you need a paradigm shift in order to learn a new behavior. Examples include how you coach an employee, how to speak more candidly, how to work independently, how to ask for and receive help from others, how to move from an individual contributor role to being a leader, or how to become a better listener.

I had never taken a tennis lesson in my life… until the first Friday of September this year. I took the opportunity to fill in for my son’s friend, who couldn’t make their shared tennis lesson that day. I had played tennis once or twice a year since I was 16. Of course, “played” is an overstatement, since I am very inconsistent with hitting the ball over the net. Because tennis is one of the few open outdoor activities still available during the pandemic, I started to go more often to the courts with my family. However, my inconsistent technique was making the experience painful. This is why I was so happy to have my first lesson. Throughout the lesson, the instructor showed me the ideal technique, and corrected me when old muscle memory would kick in. She observed and corrected multiple problems I had with my form, such as leaning backwards when I hit and swaying side to side with my swing, rather than moving by body low to high. She also showed the mechanics of a good serve. Did that first lesson solve all of my problems? No, it only exposed them. I needed to be willing to be unskilled for a while as I practiced new techniques and listened to the feedback I was receiving. I went back out the next Friday to practice my serve by myself. I was slowly practicing the technique of the serve which I had learned, over about 45 minutes, but of course making mistakes along the way. My wife told me later that, after I left, she overhead the two other guys on the adjacent court joking about me not being a serious tennis player. I had to chuckle, as this is the exact point of this learning habit: in order to learn you will not immediately be good when you’re learning it.

Be patient – how willing am I to slowly repeat a skill?

Practice is important. How you practice, though, can be just as important as whether you practice to begin with. My mom was a pianist, organist, and a teacher. Later in her teaching career, she began to use the humble snail as a teaching aid to her students. To her, the snail represented a proven technique in practicing a skill: slow repetition. For those of you who aren’t musically inclined, when you face a difficult passage in a piece of music, such as with the piano where your fingers don’t want to move quickly enough or get jumbled when playing the passage, the surest way to improve your performance is by slowing the tempo (speed) down and practicing the section slowly … over and over again. In contrast, if you continue to practice something quickly or sloppily, you will engrain the sloppiness into your playing and you won’t improve. I remember, as a child growing up, hearing my mom practice a section from a piece that was giving her difficulty at 30-50% of the desired speed, sometimes for ten or twenty minutes straight. As a family member, this was quite annoying. I know my own family can’t stand it once I have repeated a section of music 5 times or more in a row. However, this technique of slow repetition, aimed at mastery, is effective. Give yourself latitude as you’re learning and, when needed, go about it slowly. Get in the habit of slowing down, especially when it seems you are struggling with a new concept or way of doing things.

Applying the habits

My point is to share habits which have worked for myself and others. By developing these habits, you can approach new subjects and retain the information. If you approach learning with receptiveness to feedback, are both motivated and have the expectation to learn, are willing to be courageous and fail, and patient with yourself as you do, I guarantee that you will succeed in your learning endeavors.