<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tom Harada</title>
    <description>The latest articles on DEV Community by Tom Harada (@p10q).</description>
    <link>https://dev.to/p10q</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F298782%2F0a11fb09-1acc-4742-a25c-7ec0de5d046f.jpeg</url>
      <title>DEV Community: Tom Harada</title>
      <link>https://dev.to/p10q</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/p10q"/>
    <language>en</language>
    <item>
      <title>Engineering Management Tip #7: Opportunities in Transition</title>
      <dc:creator>Tom Harada</dc:creator>
      <pubDate>Sun, 27 Oct 2024 18:21:27 +0000</pubDate>
      <link>https://dev.to/p10q/engineering-management-tip-7-1fkd</link>
      <guid>https://dev.to/p10q/engineering-management-tip-7-1fkd</guid>
      <description>&lt;p&gt;"Things turn out best for the people who make the best of the way things turn out." - John Wooden&lt;/p&gt;

&lt;p&gt;There are five levels you can group your reports under:&lt;/p&gt;

&lt;p&gt;1) close to promotion, performing at the next level + at their level&lt;br&gt;
2) trending back from near promotion to more at the current level&lt;br&gt;
3) at the current level&lt;br&gt;
4) trending from the current level to under-performing&lt;br&gt;
5) consistently under-performing&lt;/p&gt;

&lt;p&gt;When a person is performing in bucket #1, you have to be very sure they are performing at their level and the next one consistently. They must have long-term potential (in part they can show this by temporarily operating at two different levels) and be moving to the next level consistently (slightly above #4 for the next level only trending upwards/forwards instead of backwards/downwards). And if they are, it is your responsibility to get them promoted.&lt;/p&gt;

&lt;p&gt;For #2, the employee is trending from close to promotion back to performing at the level. This can be very hard for an employee to hear, but you have to give feedback if this is the case. You have to let them know that they are trending back to #3. And you need to be specific and concrete about why (i.e., include at least two anecdotes and ideally some measurable data). Finally you should setup a plan for how to close the gaps to get back to #1. Great managers do this proactively.&lt;/p&gt;

&lt;p&gt;At #3, you have to tell them why they are not yet performing at the next level and what they are doing at their current level that they can do better to get to #1. Again specific examples are essential for constructive feedback. And charting the path to get to #1 is one of your most important (and hopefully enjoyable) things to do as a manager.&lt;/p&gt;

&lt;p&gt;At #4, you need to start coaching them consistently. You absolutely have to (an inexperienced manager will make the mistake of not being proactive about this bucket). You need to meet weekly or regularly and work towards specific goals. You can't sugar-coat it, you have to be real about whether they are on track for these goals; and if not, and circumstances are outside of their control, you need to find other ways for them to demonstrate moving back into #3. Your skip manager and potential HR business partner need to start becoming involved. You do your employee a disservice, while in this coaching period, if you mislead them into thinking they're at #3 when they're still in #4. Set super clear goals and be crisp about the gaps that need to be addressed to get back to #3. It is super important when a colleague enters #4 that they know what is at stake. The goals set out in the start of the coaching period for #4 have to be finished in the coaching period. They can be updated, substituted, etc. if they cannot be completed for reasons outside of the colleague's control. However if they are not completed, they will need to move to bucket #5.&lt;/p&gt;

&lt;p&gt;If they are in #5, by definition they need to have been given consistent coaching already. (Note if an employee does something fragrant, they jump to #6, i.e., discussion with your management and HR business partner about immediate termination. These buckets are for non-fragrant cases.) So being in #5 by definition means they've had consistent coaching but they have not been able to close the gaps. It's related to work, it's not personal, but as they enter bucket #5, and depending on your company's policy, they should probably be given (1) clear alternatives for leaving the company (e.g., some sort of severance option) or (2) a performance improvement plan with very strict goals where it is abundantly clear that since they have not met the role guidelines despite coaching for the role and level (step #4 should have taken 1-2 months) this is the final chance to improve performance. Within bucket #5 if they choose to go the performance improvement plan route, and if they do not perform against the crisp expectations outlined in the plan, they will be managed out. &lt;/p&gt;

&lt;p&gt;At more junior levels the time intervals and flexibility in buckets for #4 and #5 are longer. In more senior levels, you "spend time with family" much faster, but hopefully by then you are familiar with how these transitions work and pick up on the feedback in #2 and #3 without needing formal coaching. &lt;/p&gt;

&lt;p&gt;If you're in #2, #3, #4, or #5 -- which statistically is probably 80% of people -- to improve you need to listen keenly at every hint your manager and others give regarding feedback. Ask if it's unclear. You owe that to yourself. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Engineering Management Tip #6</title>
      <dc:creator>Tom Harada</dc:creator>
      <pubDate>Sun, 07 Apr 2024 05:42:58 +0000</pubDate>
      <link>https://dev.to/p10q/engineering-management-tip-6-3gec</link>
      <guid>https://dev.to/p10q/engineering-management-tip-6-3gec</guid>
      <description>&lt;p&gt;To communicate clearly speak crispy. Breathe until your fight/flight emotions fade away. Breathe until you have something useful to say. And when you speak (1) remove the upswing at the end (2) lower the tone of your voice and (3) remove self-analysis (there's just not time to worry about how you sound)/hesitancy when speaking. All via &lt;a href="https://www.youtube.com/watch?v=NRsOm13pWag" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=NRsOm13pWag&lt;/a&gt; via my manager. The tip about leading with open-ended questions is great too. Also consider root causing and conditioning yourself with exercises mentioned in: &lt;a href="https://www.youtube.com/watch?v=BQM3Yq93nVc" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=BQM3Yq93nVc&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Engineering Management Tip #5</title>
      <dc:creator>Tom Harada</dc:creator>
      <pubDate>Wed, 27 Dec 2023 15:48:02 +0000</pubDate>
      <link>https://dev.to/p10q/engineering-management-tip-5-2mlc</link>
      <guid>https://dev.to/p10q/engineering-management-tip-5-2mlc</guid>
      <description>&lt;p&gt;Coach early, coach often. Feedback is a gift. Be kind (not necessarily nice). Over-communicate. And find your way to insist on the highest standards (e.g., kaizen).&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Engineering Management Tip #4</title>
      <dc:creator>Tom Harada</dc:creator>
      <pubDate>Wed, 27 Dec 2023 15:47:11 +0000</pubDate>
      <link>https://dev.to/p10q/engineering-management-tip-4-1gin</link>
      <guid>https://dev.to/p10q/engineering-management-tip-4-1gin</guid>
      <description>&lt;p&gt;Write a mini doc (or as needed a more formal doc) for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ahead of all meetings (including 1:1's)&lt;/li&gt;
&lt;li&gt;projects&lt;/li&gt;
&lt;li&gt;new ideas&lt;/li&gt;
&lt;li&gt;new problems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows you to spend your time brainstorming ahead of time and to ask good questions or provide guidance during the meeting. For important meetings set a reminder (e.g., use the Due app) 15 minutes before to ensure the mini doc is written.&lt;/p&gt;

&lt;p&gt;Ideally write them in a place where you can share the doc as needed.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Hardware, Software, Learning Sources</title>
      <dc:creator>Tom Harada</dc:creator>
      <pubDate>Fri, 14 Oct 2022 04:25:49 +0000</pubDate>
      <link>https://dev.to/p10q/fresh-computer-setup-5flm</link>
      <guid>https://dev.to/p10q/fresh-computer-setup-5flm</guid>
      <description>&lt;h1&gt;
  
  
  Hardware
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Keyboard
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Nulea-Ergonomic-Keyboard-Featuring-Compatible/dp/B09QHFYSJ6" rel="noopener noreferrer"&gt;Nulea Ergonomic Wired Keyboard&lt;/a&gt; + remove keys from numpad and attach macOS Magic Trackpad with velcro strips&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Monitor
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.lg.com/us/business/computer-monitors/lg-27md5klb-b" rel="noopener noreferrer"&gt;LG Ultra Fine Display&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Computer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;MBP (max the specs if you use it a lot, esp. for mobile or client development, you use it a lot - MB4 / 128GB / 8TB) + Cloud/EC2 desktop&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Headphones
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.apple.com/shop/product/MYQY3AM/A/earpods-usb-c" rel="noopener noreferrer"&gt;Apple Wired Headphones&lt;/a&gt; (I just lost too many AirPods Pro in the laundry and these work fine, good microphone, able to switch between phone and laptop, etc).&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Desktop Software
&lt;/h1&gt;

&lt;h3&gt;
  
  
  macOS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;defaults
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false
defaults write -g ApplePressAndHoldEnabled -bool false
defaults write NSGlobalDomain ApplePressAndHoldEnabled -bool false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;System Preferences

&lt;ul&gt;
&lt;li&gt; Keyboard&lt;/li&gt;
&lt;li&gt;map Caps Lock -&amp;gt; Control&lt;/li&gt;
&lt;li&gt;set key repeat to fastest and delay shortest&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Chrome
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ARIA Devtools&lt;/li&gt;
&lt;li&gt;Tampermonkey&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Programming Languages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rust-lang.org/" rel="noopener noreferrer"&gt;https://www.rust-lang.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/" rel="noopener noreferrer"&gt;https://nodejs.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.python.org/" rel="noopener noreferrer"&gt;https://www.python.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Design software
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Figma&lt;/li&gt;
&lt;li&gt;Blender (&lt;a href="https://gist.github.com/p10q/c4702f2f211e49e9d066ef3f6420b803" rel="noopener noreferrer"&gt;shortcuts&lt;/a&gt; to not use numkey and track pad), Inkscape, Krita (simpler the better until you need extra features)&lt;/li&gt;
&lt;li&gt;After Effects, Illustrator, Photoshop, Premiere Pro&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Work productivity software
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Communication: Slack, Chime, Outlook&lt;/li&gt;
&lt;li&gt;Notes and todos: Things (also &lt;a href="https://github.com/p10q/things-patcher" rel="noopener noreferrer"&gt;things-patcher&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Scripts: use &lt;code&gt;expect&lt;/code&gt; scripts and the macOS Keychain app to automate VPN and access token initialization daily on laptop and cloud desktops.&lt;/li&gt;
&lt;li&gt;LLMs: Claude (Anthropic) for work, GPT for personal&lt;/li&gt;
&lt;li&gt;Coding CLIs: Q CLI for work, Claude Code for personal&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Terminal (Warp)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;.warp/keybindings.yaml
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"editor_view:insert_autosuggestion": tab
"pane_group:navigate_left": cmd-left
"editor_view:home": none
"workspace:activate_prev_tab": alt-cmd-left
"editor_view:end": none
"workspace:activate_next_tab": alt-cmd-right
"input:open_completion_suggestions": ctrl-space
"pane_group:navigate_right": cmd-right
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://gist.github.com/p10q/500583bc598e25de0f2beb805d6f2482" rel="noopener noreferrer"&gt;.zshrc&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;.vimrc&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;inoremap fd &amp;lt;Esc&amp;gt;
vnoremap fd &amp;lt;Esc&amp;gt;
"set timeoutlen=200
nnoremap ; :
nnoremap : ;
vnoremap ; :
vnoremap : ;
set splitbelow
set splitright
noremap &amp;lt;C-h&amp;gt; &amp;lt;C-w&amp;gt;h
noremap &amp;lt;C-j&amp;gt; &amp;lt;C-w&amp;gt;j
noremap &amp;lt;C-k&amp;gt; &amp;lt;C-w&amp;gt;k
noremap &amp;lt;C-l&amp;gt; &amp;lt;C-w&amp;gt;l

tnoremap &amp;lt;C-h&amp;gt; &amp;lt;C-\&amp;gt;&amp;lt;C-n&amp;gt;&amp;lt;C-w&amp;gt;h
tnoremap &amp;lt;C-j&amp;gt; &amp;lt;C-\&amp;gt;&amp;lt;C-n&amp;gt;&amp;lt;C-w&amp;gt;j
tnoremap &amp;lt;C-k&amp;gt; &amp;lt;C-\&amp;gt;&amp;lt;C-n&amp;gt;&amp;lt;C-w&amp;gt;k
tnoremap &amp;lt;C-l&amp;gt; &amp;lt;C-\&amp;gt;&amp;lt;C-n&amp;gt;&amp;lt;C-w&amp;gt;l

" Function to insert matching pairs and avoid adding a third character if there are already two
function! s:AutoClosePair(open, close)
    " Get the current line and column
    let l:col = col('.')
    let l:line = getline('.')

    " Define a range around the cursor to check for existing characters
    let l:range_start = max([l:col - 3, 0])
    let l:range_end = min([l:col + 2, strlen(l:line)])

    " Get the substring around the cursor
    let l:context = l:line[l:range_start:l:range_end]

    " If the context contains the closing character, do nothing
    if l:context =~ a:close
        return a:open
    else
        " Otherwise, insert the pair and move the cursor back
        return a:open . a:close . "\&amp;lt;Left&amp;gt;"
    endif
endfunction

" Map the insert mode keys to the function
inoremap &amp;lt;expr&amp;gt; " &amp;lt;SID&amp;gt;AutoClosePair('"', '"')
inoremap &amp;lt;expr&amp;gt; ' &amp;lt;SID&amp;gt;AutoClosePair("'", "'")
inoremap &amp;lt;expr&amp;gt; ( &amp;lt;SID&amp;gt;AutoClosePair('(', ')')
inoremap &amp;lt;expr&amp;gt; [ &amp;lt;SID&amp;gt;AutoClosePair('[', ']')
inoremap &amp;lt;expr&amp;gt; { &amp;lt;SID&amp;gt;AutoClosePair('{', '}')

" Basic settings
syntax on
filetype plugin indent on
set encoding=utf-8
"set number                " Show line numbers
"set relativenumber        " Relative line numbers (optional, remove if you don't like)
"set cursorline           " Highlight current line
"set showmatch            " Show matching brackets
set mouse=a              " Enable mouse support

" Python-specific indentation
set tabstop=4
set softtabstop=4
set shiftwidth=4
set expandtab            " Use spaces instead of tabs
set autoindent
set fileformat=unix

" Search improvements
set incsearch            " Search as you type
set hlsearch             " Highlight search results
set ignorecase           " Case-insensitive search
set smartcase            " Case-sensitive if uppercase used

" Quality of life
set backspace=indent,eol,start
set clipboard=unnamed    " Use system clipboard

" Remove trailing whitespace on save
autocmd BufWritePre *.py :%s/\s\+$//e


" Swap files
set swapfile
set directory=~/.vim/swap//

" Backup files
set backup
set backupdir=~/.vim/backup//

" Undo files (persistent undo history)
set undofile
set undodir=~/.vim/undo//

" Create these directories if they don't exist
silent !mkdir -p ~/.vim/swap ~/.vim/backup ~/.vim/undo

let mapleader = ","

" Insert pdb breakpoint
nnoremap &amp;lt;leader&amp;gt;b Oimport pdb; pdb.set_trace()&amp;lt;Esc&amp;gt;
" Insert print debug
""nnoremap &amp;lt;leader&amp;gt;p Oprint(f"DEBUG: {}")&amp;lt;Esc&amp;gt;F{a

" Quick save and run
nnoremap &amp;lt;leader&amp;gt;r :w&amp;lt;CR&amp;gt;:!python %&amp;lt;CR&amp;gt;

function! InsertAdvancedDebug()
    let current_line = line('.')
    let indent = indent('.')
    let spaces = repeat(' ', indent)

    " Find the current function
    let func_line = search('^\s*def \w\+', 'bnW')
    let context = ""

    if func_line &amp;gt; 0
        let func_text = getline(func_line)
        let func_name = matchstr(func_text, 'def \zs\w\+\ze(')

        " Check if we're also in a class
        let class_line = search('^\s*class \w\+', 'bnW')
        if class_line &amp;gt; 0 &amp;amp;&amp;amp; class_line &amp;lt; func_line
            let class_text = getline(class_line)
            let class_name = matchstr(class_text, 'class \zs\w\+\ze')
            let context = class_name . '.' . func_name
        else
            let context = func_name
        endif

        " Get parameters
        let params_full = matchstr(func_text, 'def \w\+(\zs[^)]*\ze)')
        let params_clean = substitute(params_full, ':\s*[^,=]*', '', 'g')
        let params_clean = substitute(params_clean, '=\s*[^,]*', '', 'g')
        let params_clean = substitute(params_clean, '\s', '', 'g')

        let param_list = split(params_clean, ',')
        let param_list = filter(param_list, 'v:val != "self" &amp;amp;&amp;amp; v:val != "cls" &amp;amp;&amp;amp; v:val != ""')

        if len(param_list) &amp;gt; 0
            let param_debug = join(map(copy(param_list), 'v:val . "={" . v:val . "}"'), ", ")
            let debug_line = spaces . 'print(f"DEBUG ' . context . '():' . current_line . ' ' . param_debug . '")'
        else
            let debug_line = spaces . 'print(f"DEBUG ' . context . '():' . current_line . ' here")'
        endif
    else
        " Check if we're in a class but not in a method
        let class_line = search('^\s*class \w\+', 'bnW')
        if class_line &amp;gt; 0
            let class_text = getline(class_line)
            let class_name = matchstr(class_text, 'class \zs\w\+\ze')
            let debug_line = spaces . 'print(f"DEBUG ' . class_name . ':' . current_line . ' here")'
        else
            " Global scope
            let filename = expand('%:t:r')
            let debug_line = spaces . 'print(f"DEBUG ' . filename . ':' . current_line . ' here")'
        endif
    endif

    call append(line('.'), debug_line)
    normal! j
endfunction

nnoremap &amp;lt;leader&amp;gt;d :call InsertAdvancedDebug()&amp;lt;CR&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;.secure
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export CDESK_HOST='&amp;lt;cloud host&amp;gt;'
alias c='ssh $CDESK_HOST'
alias sf-c='sftp $CDESK_HOST'
qc() {
 echo "please do a git diff --cached and then git commit changes with a good commit message summarizing the changes using conventional commit format; and please don’t add that  it was assisted by Amazon Q in the commit message" | q chat --no-interactive --trust-all-tools
}
alias q='q chat --trust-all-tools'
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Learning resources
&lt;/h1&gt;

&lt;h2&gt;
  
  
  General
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://youtube.com/" rel="noopener noreferrer"&gt;https://youtube.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hckrnews.com" rel="noopener noreferrer"&gt;https://hckrnews.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Design
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://schoolofmotion.com/" rel="noopener noreferrer"&gt;https://schoolofmotion.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learnui.design/" rel="noopener noreferrer"&gt;https://learnui.design/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Web
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://joyofreact.com/" rel="noopener noreferrer"&gt;https://joyofreact.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://frontendmasters.com" rel="noopener noreferrer"&gt;https://frontendmasters.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Algorithms
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://neetcode.com" rel="noopener noreferrer"&gt;https://neetcode.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://leetcode.com" rel="noopener noreferrer"&gt;https://leetcode.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/builders-library/" rel="noopener noreferrer"&gt;https://aws.amazon.com/builders-library/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/" rel="noopener noreferrer"&gt;https://www.youtube.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ML, AI
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/swyxio/ai-notes" rel="noopener noreferrer"&gt;https://github.com/swyxio/ai-notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/" rel="noopener noreferrer"&gt;https://www.youtube.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3D
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://polygonrunway.com/" rel="noopener noreferrer"&gt;https://polygonrunway.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cgcookie.com/p/core" rel="noopener noreferrer"&gt;https://cgcookie.com/p/core&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Management
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://randsinrepose.com/" rel="noopener noreferrer"&gt;https://randsinrepose.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=30497703" rel="noopener noreferrer"&gt;https://news.ycombinator.com/item?id=30497703&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Misc
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://p10q.github.io/tom-journey/" rel="noopener noreferrer"&gt;https://p10q.github.io/tom-journey/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>productivity</category>
      <category>node</category>
    </item>
    <item>
      <title>Operational Excellence Tip #1</title>
      <dc:creator>Tom Harada</dc:creator>
      <pubDate>Sun, 25 Sep 2022 02:40:32 +0000</pubDate>
      <link>https://dev.to/p10q/operational-excellence-tip-1-65e</link>
      <guid>https://dev.to/p10q/operational-excellence-tip-1-65e</guid>
      <description>&lt;p&gt;I like to call this technique "Top Errors Zero." Like &lt;a href="https://en.wiktionary.org/wiki/inbox_zero" rel="noopener noreferrer"&gt;Inbox Zero&lt;/a&gt;, it works by focusing on root causing and fixing your service or app's top errors and removing them.&lt;/p&gt;

&lt;p&gt;First you have to record them (and potentially you need to group them if they have customer-specific information/ids). Once recorded, you need to surface them in a dashboard. E.g., create a table of "Top errors" sorted in descending count. Optionally you can include a time chart with when these errors are occurring. And this is as simple as grouping all API calls by error message.&lt;/p&gt;

&lt;p&gt;Operational Excellence Tip #1 is: review this table regularly (e.g., weekly) and drive these errors to zero (e.g., as part of your on-call or ops work).&lt;/p&gt;

&lt;p&gt;This doesn't cover bad UX or situations where you aren't raising errors in the right place. But in general you'll be surprised how much quality improves for your customers by driving down top errors to zero.&lt;/p&gt;

&lt;p&gt;Update. Also use Pareto charts to bucket the top errors or issues to investigate.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Engineering Management Tip #3</title>
      <dc:creator>Tom Harada</dc:creator>
      <pubDate>Sun, 08 May 2022 08:00:18 +0000</pubDate>
      <link>https://dev.to/p10q/engineering-management-tip-3-5bg7</link>
      <guid>https://dev.to/p10q/engineering-management-tip-3-5bg7</guid>
      <description>&lt;p&gt;Julie Zhou, in her book &lt;a href="https://www.juliezhuo.com/book/manager.html" rel="noopener noreferrer"&gt;The Making of a Manager&lt;/a&gt;, highlights the importance of a manager's function in aligning vision and inspiring their team. To nurture a successful team, I believe in three somewhat unconventional principles: (1) maintain a positive attitude (2) practice empathy and (3) foster enthusiasm about conquering technical obstacles.&lt;/p&gt;

&lt;p&gt;Firstly, a good mood is crucial for proactive leadership; how you feel affects how you interact with others and your ability to effectively manage. Happy people inspire happiness in others, hence it is vital to find personal happiness and resilience to succeed as a leader.&lt;/p&gt;

&lt;p&gt;Secondly, empathizing with team members allows managers to understand their struggles. This empathy can help create an environment in which everyone feels enthusiastic about tasks and duties handed over to them. Managers should always assume positive intent in their team because most people deal with issues beyond their immediate working environment.&lt;/p&gt;

&lt;p&gt;Lastly, cultivating excitement in the team is crucial for innovation. Managers should focus on aligning team member’s interests with the goal of the team and always look for ways to spark their excitement.&lt;/p&gt;

&lt;p&gt;EM Tip #3: effective management begins by maintaining a happy and resilient attitude, practicing empathy with team members, and sparking excitement to drive innovation.&lt;/p&gt;

&lt;p&gt;From there mechanisms for feedback and scaling impact (including auditing these mechanisms), as well as critical conversations all become crucial, but that's for another time....&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Engineering Management Tip #2</title>
      <dc:creator>Tom Harada</dc:creator>
      <pubDate>Thu, 07 Apr 2022 05:54:32 +0000</pubDate>
      <link>https://dev.to/p10q/engineering-management-tip-2-180p</link>
      <guid>https://dev.to/p10q/engineering-management-tip-2-180p</guid>
      <description>&lt;p&gt;This second-order tip is about honesty, empathy, psychological safety, the &lt;a href="https://www.mindtools.com/pages/article/newTMC_91.htm" rel="noopener noreferrer"&gt;ladder of inference&lt;/a&gt; and listening: while you have the energy, explore until you're very confident each team member feels happy and inspired. Unblock until they're in that state. And then step back and let project/product/people growth happen.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Engineering Management Tip #1</title>
      <dc:creator>Tom Harada</dc:creator>
      <pubDate>Thu, 07 Apr 2022 05:35:11 +0000</pubDate>
      <link>https://dev.to/p10q/engineering-management-tip-1-5e81</link>
      <guid>https://dev.to/p10q/engineering-management-tip-1-5e81</guid>
      <description>&lt;p&gt;&lt;em&gt;Know the three management roles in most companies&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Rands explains it well here: &lt;a href="https://randsinrepose.com/archives/tear-it-down/" rel="noopener noreferrer"&gt;https://randsinrepose.com/archives/tear-it-down/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The importance of understanding these hats is really critical to becoming an effective engineering manager in an organization. Every successful company that I've seen has been involved with that cosmic interplay between tactics and strategy (it sounds so stereotypical and hackneyed but we keep coming back to it because the model is useful).&lt;/p&gt;

&lt;p&gt;Even solo entrepreneurs (of growing tech companies) can be evaluated like primordial big bang singularities with these three roles running around inside them: a lead focused on tactics, a director focused on strategy, and the bridge between them (the lead of leads). And again managers keenly aware of these roles can then move in and out of them ever so carefully to smooth things out when there are gaps in the organization. Is there a temporary gap in executive leadership? Know to dialup strategy and look for ways to lead this informally. Is there a gap in communication between strategy and tactics? Know which role to temporarily assume or which people to talk to and help grow (i.e., 'manage' upwards/sideways/downwards).&lt;/p&gt;

&lt;p&gt;EM tip #1: to be a great engineer it helps to work backwards from what a manager is focused on as well. And to be a great manager within an organization it helps to work backwards from what directors and managers of managers are doing. Know the structure of modern companies that follow this paradigm so that friction in strategic or tactical areas doesn't slow you down.&lt;/p&gt;

&lt;p&gt;Second-order tip: this applies beyond engineering organizations. You can practice the strategy and tactics duality within your own life or career. It's only within a larger organization that differentiation of the roles across multiple people happens.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>vim shortcuts that i find central</title>
      <dc:creator>Tom Harada</dc:creator>
      <pubDate>Sun, 22 Dec 2019 22:27:30 +0000</pubDate>
      <link>https://dev.to/p10q/vim-shortcuts-that-i-find-central-5fjm</link>
      <guid>https://dev.to/p10q/vim-shortcuts-that-i-find-central-5fjm</guid>
      <description>&lt;p&gt;This is my first post. I always wanted to write a blog post about the vim key-mappings and general approaches that I use that I've found super useful over the years. I tend to make them work wherever there is vim or vim-emulation (Vimium / Chrome, VSVim / VS Code, IdeaVim / IntelliJ, XVim2 / Xcode, tmux integration, Codepen, etc.). &lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.youtube.com/watch?v=pKDABrZ418c" rel="noopener noreferrer"&gt;Till I Die&lt;/a&gt;:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ctrl-hjkl -&amp;gt; ctrl-w hjkl with tmux integration
gd -&amp;gt; go to definition (e.g., using ALE; i haven't cleaned this up for all languages)
ctrl-o -&amp;gt; jump back
ctrl-i -&amp;gt; jump forward
. -&amp;gt; repeat command
qa...q -&amp;gt; macros
&amp;lt;format on save (e.g., using prettier, black)&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;a href="https://www.youtube.com/watch?v=-_vY-MX_Lj4" rel="noopener noreferrer"&gt;Til the Sun Dies&lt;/a&gt;:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fd -&amp;gt; escape
[In System Preferences, map] caps lock -&amp;gt; control
; -&amp;gt; :
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>vim</category>
    </item>
  </channel>
</rss>
