February 11, 2019
I read this article Compounding Knowledge from Farnam Street and enjoyed it. The article talks about lifetime learning and figuring out what to learn. There is a ton of information out there and it is not all correct or tested. How do you pick what to read and learn? Tons of smart people have different answers, some only read books published at least 10 years ago, others read no news. Can we apply a similar principle to help us keep up in technology?
In the fast moving programming world Hacker News has new frameworks and technology daily, but can we can find knowledge and patterns with longer half lifes. Technology is infamous for being fast moving and constantly changing but as things change, a lot does not. Skills and technologies you can learn that will be compounding knowledge:
- Debugging programs and systems
- Editing and reading text.
- Managing text
- Managing, storing and accessing data
Do you write perfect code the first time? Do you only use other code that is perfect? Probably not. For most of us, things will go wrong. How we handle when things do not work is a transferrable skill that will not stop being useful.
Learning to break down what is happening, validating assumptions, and inspecting components that are not how you expected are the basics of debugging. Of course there are multitudes of debugging tools that can help and pieces to learn about but these come with time and experience. To start on the debugging path you just need to print output from your program.
Pages could and have been written on debugging but one other thing to learn is to not be afraid to jump into code you use. Sometimes your code will be correct but a library, language or even operating system will be effecting your code.
These debugging skills can probably even help you outside of computers!
The year is 2019, text is so 1970’s, when you need to program you hop into VR and … open up a text editor.
Yeah, when you need to program you open up a text editor, that same tool that’s been around for decades. Emacs and Vi were both initally released 43 years ago. People still use these tools today! Of course since then we have gotten a lot more editors and IDE’s but in 43 years we have still rely on reading and editing text.
Editor wars have flamed on for decades and the fires will burn for decades more. People love to tie their programming identities and credentials to being able to use a particular editor, it really does not matter which though, pick a text editor and get good at using it. Using a text editor well will not stop being useful anytime soon.
As a programmer we are not just editing text; we need to view, search, track changes, build a mental map of how things work, etc. To help you do this there are a tools that will pay dividends long term, pick some and practice using them.
What was this function doing when it worked? What did it use to do? These are important questions that will help you if you know the answer to. If you use version control for your source code you should be able to find that out. Knowing how to use and track changes like this is useful almost daily.
Once you are working in an established code base or on a team with other members there will be code that you have not seen before or that you have not read in a while. You are going to need to figure out what is going on in the code. If you learn to search and jump around with your editor or the command line you can jump into new projects and languages easier.
If you want to learn how to use the command line for managing text here are useful tools start: moving files (
mv), removing files (
rm), searching for text (
grep), end of a file (
tail), and word or line count (
wc). There are a bunch more but if you start here you can dig in and learn more.
Once code is written it starts to rot. Not literally but your brain will decide to forget details on exactly why you wrote what you did and the programming library, API or language you use will update and your code will no longer work correctly. Sometimes the code works great but it needs to change because your requirements changed.
How do we know what still works and what changed or broke? If you move a bunch of code around does it still work? Of course you will manually run it and check that it compiles or looks right but how do you know? You don’t. Verifying code is important and comes from having automated testing.
Knowing how, what, when and where to test code is a really important skill that translates well across all programming and I would qualify as compounding knowledge. Writing testing this will also help guide design decisions and help your code last longer so you can solve new problems, not old ones.
Managing, Storing and Accessing Data
Databases and data storage are a huge component of nearly every software project. Understanding what your project needs for data storage and then implementing it correctly is an important task. If you use the wrong tool or the right tool in the wrong way your project can be technically awesome still a failure.
Databases can get complex; understanding the access patterns you need, the tradeoffs between database types, using caches correctly, and more will come with experience. To get started though a good place to start is to pick up a skill that is still being used 45 years after it appeared: SQL.
SQL is a programming language for defining, accessing and processing data from databases. It is used today by almost every technology company in some aspect and the fundamentals generalize well to other databases and technologies.
Improving your ability to learn is going to continue to help no matter what happens next in your career or in programming. Technology is constantly changing but if you continue to focus on improving your ability to learn while adding some knowledge that sticks for the next round you will have success.
You do not have to learn every new technology or framework, instead focus on the problems you want to solve and try to learn what the tools are doing to solve those problems. Learn the problem’s details and what you need is useful and will save you a lot of time and can enable super powers of getting stuff done.
Identifying what you do not know, understanding how to learn that and then discerning what you need and do not is a valuable learning skill will come back over and over again.
January 20, 2019
One thing I struggle with is seeking validation. As a relatively normal human I am often seeking recognition that my emotions, thoughts and observations are legitimate. I seek validation that what I do is meaningful, that people care about what me, etc. There are two sources of this validation, internal and external and most of us are driven and receive mostly external validation.
Companies across the internet and off all know this, they feed off external validation. Validation that we are part of a group sells lifestyles, apparel, vacations and more. Social media feeds a huge validation addiction allowing people to broadcast thoughts and moments to the world, and with a simple like, view or retweet we get a tiny burst of validation
There is nothing inherently wrong with external validation. It’s a powerful motivator that we all need. A problem I see is that when we get a lot of this cheap external validation we struggle to develop and strengthen our internal self. The “I am doing this because I want to”, “These are my thoughts”, and “this is me” feelings do not come as easily from external sources as they do from reflection, purposeful work with trial and error and feedback.
Feedback? “But Aaron, that sounds external?” It may or may not be but I see a difference here. Feedback is an active form of validation and nothing says it is purely positive. Constructive feedback, thoughtful recognition of emotions or views and suggestions on ways to improve the self are more valuable then a simple like, retweet, or simple comment.
So here is is my call for you to validate me. Not with a like or a retweet but with feedback, thoughtful comments, critiques, criticisms and acknowledgement. I will not always get validation externally. But when I do I hope it can be meaningful or actionable.
What am I doing to limit external validation and improve internal validation?
- Posting less on platforms that optimize for self validation
- Turning off tracking and metrics on this blog
I have been posting very little directly on Facebook, Instagram, and Twitter. Instead I contact people directly or post on micro.blog. What does microblog do different? No retweets, visible followers or visible likes. Anything I post on there is mine and there is social validation but it is respectful and thoughtful.
Turning off metrics on blog allows me to ignore the “do people like this?” and enable “do I like this” I am writing for me. Of course I want validation but I want the majority to come from me. If I really make an impact or you have any feedback I would love to know but likes and retweets and page views are distractions and not important
I think this stance is a little radical but it has been valuable to me. I have been reflecting and tweaking my goals and habits, making sure they come from the self. Want to validate me? Do it if you want. If you do not validate me that is fine because have already validated myself.
January 01, 2019
Another year down and how did we do? I had a great year. Highlights were learning a lot, traveling to new places, and improving my health and fitness.
2018 was a year with mixed success with goals. I had a bunch of goals and hit some but not all.
My 2018 book reading goal was 40 books. That was quite an ambitious goal that I did not meet. I completed 20 books, only half of my goal. You can follow my notes and see all books at /about/reading but here is an inlined list of some of the most influential books I read(in alphabetical order):
- Chaos Monkeys
- I Contain Multitudes
- Snowball: Warren Buffet
- The Black Swan
- The Left Hand of Darkness
- The Traitor Baru Cormorant
Though I did not hit my quantity goal, this years reading was still a success. I read a few new genres like thrillers, discovered a few classic sci-fi’s that I loved and made my way through some really interesting biography and business books. My book reading was also augmented by a lot of articles, blog posts and technical papers I read too. Not bad Aaron.
I set two major fitness goals for 2018:
1.) Continue running and run my second half marathon.
My running goal was successful, I ran my second half marathon in October with a time of 1:52, only three minutes off my 2017 half time of 1:49. I also completed my first 10k and ran a few fun 5k races througout the year.
Some overall 2018 Strava stats for fun:
- Miles: 266.8
- Hours: 40 hours and 46 mins
- Elevation Gain: 4,948 ft
- Runs: 74
2.) Climb at a V5 level bouldering.
I did not hit this goal unfortunately but not intentionally. Last year I started the year predominately bouldering but as the year progressed I ended up top roping way more than bouldering since my main climbing partner is not a big boulderer. The spirit of this goal was to improve my climbing though and I did that. I went from climbing 5.9’s and 5.10- to being able to handle 5.10’s, most 5.11’s and I can project and get a few 5.12a’s. This is a big milestone for me and it’s been fun watching my progress through the year.
Cooking, Eating and Health
I worked on eating healthier and trying new recipes this year. Michelle and I love to cook and always enjoy trying to cook new cuisines and dishes. I set a goal of 24 dishes, honestly I stopped keeping track but I know we hit this. One thing that was new and fun was signing up for a CSA vegetable share in the summer. We ended up trying a bunch of veggies and found a new favorite vegetable: Hakurei Turnips!
I hoped to lose 10 pounds this year and did not. I ate (relatively) healthy, worked out a bunch and got a lot stronger climbing though and I think this one can be a pass.
Miscellaneous Goals I Did Not Hit
- Take two college classes online.
- Read a book in German.
- Go backpacking
These goals were rather specific and required dedicated intentions of completing. I did not work on these and I did not get them done. In the future I might try to make more actionable goals or write out intentions instead of specific goals without details.
8,760 Hours Review
For this part of the review I’m roughly summarizing the output of my reflections from a helpful PDF I found called 8,760 Hours. The document walks through twelve categories and has questions to reflect on covering most areas of life. I picked a few categories’ responses and summarized below.
Contribution & Impact
This year I contributed back with time and energy volunteering for a few events like Railsbridge and Hack.Diversity. I also have been working on mentoring some newer developers where I can. At BookBub I organized Geek Lunches to help engineers grow and learn more. Overall I enjoy helping others learn and grow, especially in technical fields but not only technical skills.
Location & Tangibles
I’m living in a cool little apartment in Cambridge. This year I spent energy working to simplify my life. I have collected a lot of things over the years and not everything is used or loved. I made a point of donating clothes, gear and other items that don’t get used much. This year is the first time where I recognized I have almost everything I need and I try keeping my wants limited.
Money & Finances
Another good year on the finances part, I graduated two years ago with a ton of student loans and I have been aggressively paying them back. I have determined my financial priorities, some short and mid term goals and now I just need to continue working on them.
One financial lesson I learned is budgets are hard, I went off and on attempting to stick to a budget, and it did not really work. What I do instead is have everything required be automatic and only allow myself to spend a little of what’s left over my account, with everything on auto pay including loan and retirement savings there it takes effort to stop myself from saving, a good spot to be.
Education & Skill Development
Always the continuous learner I have grown and learned a ton this year. My interests and skill development has been a little eclectic though. This past year I spent a bunch of time learning about personal finances and productivity. Learning these things now will hopefully pay dividends for years to come.
Social Life & Relationships
I made some great new friends this year and strengthened older relationships. One thing I really appreciated this year was being able to hit up old friends and feel like we just hit it off again. Good friends do not need to be in constant contact. We all have busy lives but taking 10 minutes to send a thinking of you email or text and starting a great conversation is awesome.
Productivity & Organization
Productivity and organization is a regular process of honing, reevaluating and adapting to changing circumstances. This happened again this year and I’m sure it will change many more times.
One big change from me came from dropping social media from my phone in the beginning of the year. I reinstalled Instagram and Twitter but I have a much looser attachment to them. I highly reccomend this technique and will probably repeat soon to help prevent the addicting hooks from digging back in.
For most of the year I was on a Mac and my productivity tools were based around the native Evernote app which is fantastic on Mac. Unfortunately the web interface does not compare and since moving back to Ubuntu, I moved to a
docsfolder in Dropbox. Inside this folder is a tree with subfolders and Markdown notes. Not as flashy or as powerful but it’s mine and it works well, especially since I can edit in Vim.
This is a fun new addition to my software tools. I have not committed to this 100% but I have been using Task Warrior to track explicit to-do’s with tags and priorities. It then presents tasks as an ordered list of your to-do’s sorted by highest priority first. This has been helpful for finishing tasks I start and forget to finish as well as determining what needs to be worked on next.
I have two notebooks: a work notebook and a home notebook. I use these for meeting notes, brainstorms, jotting down tasks, drawing diagrams, etc, whatever I need. Splitting work and home makes sense for me. I am still experimenting with brands. I just finished a Moleskine soft cover and I am using a Rhodia with my new job and enjoying it so far. I loosely follow some bullet jornal techniques but try not to over complicate.
Adventure & Creativity
Adventure? Got that in the bag. This year was a good year for adventure. Some highlights:
- Camping in Acadia
- Multiple outdoor bouldering and top roping trips
- Learning to lead climb
- Seattle and Mt. Rainier Trip
- Hikes and other fun day trips
Wow we made it this far! That was a lot to cover and this was the abbreviated version. Maybe you skipped a section or two or wanted to read the end first. How did the year go? Any big takeaways? This was a great year for me. Nothing stands out as an outstanding accomplishment or big announcement but this year was full of awesome small steady wins. I hope these wins compound and help me power through 2019.
I didn’t hit all my goals but I am not dissapointed in myself. The things I did accomplish were awesome and I am still learning. I hope I can make 2019 a little more focused on the direction I am going and align my goals closer with priorities I discovered this year.
Happy new years and good luck on your journey in 2019, put in good work.
December 08, 2018
I recently left my awesome engineering job at BookBub to join a tiny robotics startup. Though I loved my team and the company and mission at BookBub; an opportunity recently came up that I couldn't refuse. Ever since I was a young nerd, I've entertained dreams of working with robots. There is something exciting about a physical object with a "brain" that you brought to life. I've even played with a few robot projects in college and high school but never worked to make it my job.
I've mainly been learning and working on web and operations projects with some distributed systems work. Pretty far from most robot projects, but an old college friend had started a company building robot solutions and could use me. The company consulting to either retrofit or build new robots that are human and environment aware. I joined the team primarily to leverage my experience to connect the robots and build tools for robots and humans to understand their world.
I started working my new job the week of Thanksgiving and it's been an awesome few weeks. I'm learning a ton and am excited for everything in the works. Interesting in hearing more or catching up? Feel free to hit me up. I think this stuff is super interesting and I'm excited to be working on these problems.
November 19, 2018
I just set up the Thinkpad P1 as my new work computer. The new computer involved some joys of Linux I haven’t had to do in a long time. I had to do a few workarounds so I decided to document them here.
I was installing Ubuntu 18.04 on the P1 with the Nvidia Quadro P2000 and the 4k display. On first run trying to install Ubuntu it errored out loading. I ended updating Windows 10 completely and flashing an updated bios I found reference to in this thread see the direct Thinkpad driver link here.
After that I got a little further, but ended up having issues installing while running in hybrid graphics mode. I switched the bios setting to discrete and could successfully install Ubuntu. But after the first boot I could not login. Digging around it appears that something was not 100% with the graphics and X11?. Choosing the option of logging in with Gnome and Wayland allowed me to get to a terminal and updater. Where I promptly upgraded everything with a
sudo apt update sudo apt dist-upgrade
Performance during this was terrible though. Mostly due to gnome using > 100% CPU, nice. To get the Nvidia graphics card working I ran
sudo apt-get install nvidia-375 nvidia-settings. After a reboot this did a lot better.
After the annoying setup everything has been working well since. Overall the laptop is pretty nice, good size and high quality screen. Extremely dissapointed that the laptop came with a broken delete key though. It should have two small clips to keep it attached but one is broken so hitting the delete key on the right side pops off the key. Crazy for the brand once renowned for their reliable keyboards. We should be giving Thinkpad a hard time if Mac get’s one for a less obnoxious reason. Performance wise it seems decent but it definitely runs hot. I have the 4K screen upgrade, Intel® Core™ i7-8750H, 32 GB of RAM and the Quadro P2000 graphics card. Together this makes for a powerful computer but it’s definitely not quiet, I need to do some tuning so that I’m conserving battery and not running a fan on high frequently.
October 22, 2018
I recently took a trip back home from Boston to Philadelphia and had two 8 hour bus rides. On these bus rides I tried getting some development done and here’s some tips:
1.) Don’t do it.
That’s it folks, all I got. … Not really. I actually did get some development done but mostly I got administrative work and thinking done.
Here are my real tips:
1.) Be prepared to be disappointed with the internet.
This should be a given but just in case you have never used bus WiFi and you saw the promise of free WiFi and rejoiced. Stop it right there. Bus WiFi is not fast, consistent or reliable. Definitely not a great environment if you need to be searching for answers or downloading and uploading code. The highlight of my bus WiFi experience was a
git pushthat just hung.
2.) Have offline docs and your dependencies installed.
If you don’t have a development environment set up or some offline docs. I recommend you do that before the trip. On MacOS I use Dash, which lets me search across language and library documentation offline from Alfred. This is a great tool for fast offline lookup and covers many internet searches without requiring the connection.
3.) Don’t plan on being super comfortable or focused.
Another no-brainer but you aren’t going to be the most focused, comfortable or productive. This isn’t going to be an ideal development environment. People talking, sights going by, bumps and jostles, these and more contribute to a less than ideal deep work setting.
You can still get work done though. To make things smoother you can start by bringing good noise isolating or cancelling headphones. Just like in an open office; a decent pair of headphones goes a long way in distancing yourself from the noise and commotion around you. Also fully charge your laptop ahead of time. You should have a power outlet but occasionally they don’t work and often they will not hold your charger without some continual force or pressure, especially if it’s the big bulky Mac charger. My charger fell out constantly; better to charge only when you need it. Why not start with a full charge?
4.) Plan the right kind of work
A good work plan is critical, if you don’t know what you need to work on or need to do exploring or research you will have trouble. The main development tasks that I had success working on included some refactoring and test writing. Everything I needed was already on my computer and writing tests is often more thinking and implementing than research.
When planning bus work think about what requires little less internet or can be asynchronous. I had success doing the following:
- Reviewing other’s pull requests.
- Writing up feedback for people’s reviews.
- Writing tests and replying and refactoring feedback on an existing feature I am working on.
- Reflecting and writing up notes.
- Writing this blog post.
- Plan and organize calendar, notes, to-do’s, etc.
5.) Enjoy the bus ride.
Personally I love long bus rides. Though not the most appealing work environment; buses constrain you in ways that can be rewarding. Minimalist principles apply here where subtracting can really add to your focus. The constraints of an 8 hour low quality internet connection helps me get s*** done and reflect on things that I don’t always get too. I also love being on the move and working in new places and environments, it can be energizing and carries over to when you are back in the office or home.
Overall just embrace the limitations and you can get a lot done; just don’t plan burning through a lot of bugs or releasing new features.