<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>Jonathan Maltz</title>
 <link href="http://maltzj.github.io/atom.xml" rel="self"/>
 <link href="http://maltzj.github.io/"/>
 <updated>2026-02-07T12:22:05+00:00</updated>
 <id>http://maltzj.github.io</id>
 <author>
   <name>Jonathan Maltz</name>
 </author>
 
 
 <entry>
   <title>Why I Write Weekly Notes</title>
   <link href="http://maltzj.github.io/posts/writing-weekly-notes"/>
   <updated>2026-02-01T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/writing-weekly-notes</id>
   <content type="html">&lt;p&gt;I have kept a weekly (or bi-weekly) Confluence blog at Stripe for the better part of 4
years now.  Every once and a while people ask why I do that.  Here&apos;s what I tell
them.&lt;/p&gt;

&lt;ul&gt; &lt;li&gt;&lt;b&gt;It helps in performance review season: &lt;/b&gt; It&apos;s hard to remember
        everything you did when performance review season rolls around.  Having
        a weekly blog of your work helps you easily catch up on documents I
        wrote, decisions I drove, and overall successes.  &lt;/li&gt; &lt;li&gt;&lt;b&gt;It allows
            me to shout people out: &lt;/b&gt; I want to make sure people know that I
        saw the fact that they did good work and I really appreciate it.
        Tagging people in a weekly blog post via Confluence is a great low-key
        way to say &quot;I saw you and enjoyed what you did&quot;.  It also helps me
        elevate neat things that I think are valuable to lots of people.  I try
        to be especially mindful of doing this with more junior engineers or
        underrepresented folks.&lt;/li&gt; &lt;li&gt;&lt;b&gt;It helps create ambient awareness of
        my work: &lt;/b&gt; My interests tend to be pretty broad.  Broadcasting notes
    creates awareness of where I&apos;m focusing so that others can find me and
    potentially either help me out or we can work together to connect our work
        into a coherent whole.  In other words, it helps increase my &lt;a
            href=&quot;https://modelthinkers.com/mental-model/surface-area-of-luck&quot;&gt;luck
            surface area&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;b&gt;It helps me organize my thoughts: &lt;/b&gt;
        Writing is thinking.  Good ideas don&apos;t emerge from my brain on the first
            try.  That&apos;s not how my brain works.  I need to process a lot of
            thoughts out loud or at my keyboard in order to get all the
            messiness straight in my own brain.  By keeping a weekly blog it
            gives me a place to dump down those initial thoughts and sketch out
            rough drafts to refine them.  This helps me get to a clearer final
            story.  I also like to think it helps others see that staff
            engineers aren&apos;t some impossibly brilliant people who come up with
            things out of thin air.  We&apos;re humans who bumble through problems to
    get to the right place, just like everyone else.&lt;/li&gt; &lt;/ul&gt;

&lt;p&gt;So far those work for me.  The habit is valuable enough for me to keep it up
for a few years.  Maybe it will be useful for you too.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Changing Process While Moving To Shipping Phase</title>
   <link href="http://maltzj.github.io/posts/moving-to-shipping-phase"/>
   <updated>2025-01-20T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/moving-to-shipping-phase</id>
   <content type="html">&lt;p&gt;I oftentimes talk about projects existing in three phases: meetings phase
(defining the scope), building phase (building it) and shipping phase
(converging and flipping the thing on).  Transitioning between these phases is
always a little chunky for different reasons.  Recently I&apos;ve noticed that I do a
set of consistent things when moving between building phase and shipping phase.
These generally feel right, so I&apos;m probably codifying them.&lt;/p&gt;

&lt;p&gt;The three things you should do when moving into shipping phase on a large
project are:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;b&gt;Make a dashboard that counts the number of tickets required to
            launch your first user-visible deliverable&lt;/b&gt;.  While you&apos;re in
        building phase it can be easy to lose sight of exactly how much work is
        remaining in order to get software into the hands of users.  By making a
    dashboard with all outstanding tickets you can give yourself a very clear
    velocity + progress tracker on &quot;how far are we from shipping&quot;.  &quot;Number of
    tickets closed per week&quot; is a pretty coarse metric, but it&apos;s often good
    enough to set more accurate estimates.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;Setup regular bug-bashes.&lt;/b&gt;  During building phase it can be easy
        to build a bunch of pieces but not have confidence that they actually
        deliver a coherent experience for users.  To combat this, I&apos;ll setup
        weekly bug bashes for the whole team to test features end to end.  This
        helps people get a really visceral feel for &quot;where&apos;s the system at
        end-to-end&quot; rather than just &quot;is my feature working&quot;.  It also
        encourages you to find rough edges in test setup and rollout which can help smooth
        out your actual launch.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;Ensure that each part of the system has an end-to-end owner.&lt;/b&gt;  In
        building phase it can be easy to think &quot;horizontally&quot; through the system
        and make sure each component works.  Oftentimes as you enter into
        shipping phase you need to start thinking about the system end-to-end.
        In this world it can be valuable to start to have people owning complete
        slices of features if they don&apos;t already.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;Write up the actual plan to test and rollout your software.&lt;/b&gt;
        Similar to the bug bashe point, it can often be easy to miss &quot;is it
        possible to rollout this thing as a single unit&quot;.  You&apos;ll want to write
        down a rollout plan to ensure this is possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Doing these things doesn&apos;t always ensure that the process of shipping goes
smoothly, but I&apos;ve found that they generally help.  So next time you&apos;re entering
shipping phase, consider keeping a couple in your back pocket to ensure you
launch successfully.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Flashcard prep</title>
   <link href="http://maltzj.github.io/posts/flashcards"/>
   <updated>2024-11-02T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/flashcards</id>
   <content type="html">&lt;div&gt;This is a little flashcard game I made to help my wife prep for the USCIS citizenship test.&lt;/div&gt;

&lt;h2&gt;The game&lt;/h2&gt;
&lt;div id=&quot;question-div&quot;&gt;&lt;span&gt;&lt;b&gt;Question:  &lt;/b&gt;&lt;/span&gt; &lt;span id=&quot;question&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div id=&quot;answer-div&quot;&gt;&lt;span&gt;&lt;b&gt;Answer:  &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;div id=&quot;answer&quot;&gt;&lt;/div&gt;&lt;/div&gt;

&lt;button id=&quot;regenerate-question&quot;&gt;Next Question&lt;/button&gt;

&lt;button id=&quot;show-answer&quot;&gt; Show answer&lt;/button&gt;

&lt;script type=&quot;text/javascript&quot; src=&quot;https://code.jquery.com/jquery-3.7.1.min.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
    var questionsAndAnswers = [
        {
            &apos;question&apos;: &apos;What is the Supreme law of the land?&apos;,
            &apos;answer&apos;: &apos;The constitution&apos;
        },
        {
            &apos;question&apos;: &apos;What does the Constiution do?&apos;,
            &apos;answer&apos;: &quot;Sets up the government&lt;br /&gt;Defines the government&lt;br /&gt;Protects the basic rights of Americans&quot;
        },
        {
            &apos;question&apos;: &apos;The idea of self-government is in the first three words of the Constitution. What are these words?&apos;,
            &apos;answer&apos;: &apos;We the People&apos;
        },
        {
            &apos;question&apos;: &apos;What is an amendment?&apos;,
            &apos;answer&apos;: &quot;A change (to the Constitution)&lt;br /&gt;An addition (to the Constitution)&quot;
        },
        {
            &apos;question&apos;: &apos;What is one right or freedom from the First Amendment?&apos;,
            &apos;answer&apos;: &quot;Speech&lt;br /&gt;Religion&lt;br /&gt;Assembly&lt;br /&gt;Press&lt;br /&gt;Petition the government&quot;
        },
        {
            &apos;question&apos;: &apos;How many amendments does the Constitution have?&apos;,
            &apos;answer&apos;: &quot;Twenty-seven (27)&quot;
        },
        {
            &apos;question&apos;: &apos;What did the Declaration of Independence do?&apos;,
            &apos;answer&apos;: &quot;Announced our independence (from Great Britain)&lt;br /&gt;Declared our independence (from Great Britain)&lt;br /&gt;Said that the United States is free (from Great Britain)&quot;
        },
        {
            &apos;question&apos;: &apos;What are two rights in the Declaration of Independence?&apos;,
            &apos;answer&apos;: &quot;Life&lt;br /&gt;Liberty&lt;br /&gt;Pursuit of happiness&quot;
        },
        {
            &apos;question&apos;: &apos;What is freedom of religion?&apos;,
            &apos;answer&apos;: &quot;You can practice any religion, or not practice a religion.&quot;
        },
        {
            &apos;question&apos;: &apos;What is freedom of religion?&apos;,
            &apos;answer&apos;: &quot;You can practice any religion, or not practice a religion.&quot;
        },
        {
            &apos;question&apos;: &apos;What is the economic system in the United States?&apos;,
            &apos;answer&apos;: &quot;Capitalist economy&lt;br /&gt;Market economy&quot;
        },
        {
            &apos;question&apos;: &apos;What is the \“rule of law\&quot;?&apos;,
            &apos;answer&apos;: &quot;Everyone must follow the law.&lt;br /&gt;Leaders must obey the law.&lt;br /&gt;Government must obey the law.&lt;br /&gt;No one is above the law.&quot;
        },
        {
            &quot;question&quot;: &quot;Name one branch or part of the government.*&quot;,
            &quot;answer&quot;: &quot;Congress&lt;br /&gt;Legislative&lt;br /&gt;President&lt;br /&gt;Executive&lt;br /&gt;The courts&lt;br /&gt;Judicial&quot;
        },
        {
            &quot;question&quot;: &quot;What stops one branch of government from becoming too powerful?&quot;,
            &quot;answer&quot;: &quot;Checks and balances&lt;br /&gt;Separation of powers&quot;
        },
        {
            &quot;question&quot;: &quot;Who is in charge of the executive branch?&quot;,
            &quot;answer&quot;: &quot;The President&quot;
        },
        {
            &quot;question&quot;: &quot;Who makes federal laws?&quot;,
            &quot;answer&quot;: &quot;Congress&lt;br /&gt;Senate and House (of Representatives)&lt;br /&gt;(U.S. or national) legislature&quot;
        },
        {
            &quot;question&quot;: &quot;What are the two parts of the U.S. Congress?*&quot;,
            &quot;answer&quot;: &quot;The Senate and House (of Representatives)&quot;
        },
        {
            &quot;question&quot;: &quot;How many U.S. Senators are there?&quot;,
            &quot;answer&quot;: &quot;One hundred (100)&quot;
        },
        {
            &quot;question&quot;: &quot;We elect a U.S. Senator for how many years?&quot;,
            &quot;answer&quot;: &quot;Six (6)&quot;
        },
        {
            &quot;question&quot;: &quot;Who is one of your state’s U.S. Senators now?*&quot;,
            &quot;answer&quot;: &quot;Chuck Schumer&lt;br /&gt;Kristen Gillibrand&quot;
        },
        {
            &quot;question&quot;: &quot;The House of Representatives has how many voting members?&quot;,
            &quot;answer&quot;: &quot;Four hundred thirty-five (435)&quot;
        },
        {
            &quot;question&quot;: &quot;We elect a U.S. Representative for how many years?&quot;,
            &quot;answer&quot;: &quot;Two (2)&quot;
        },
        {
            &quot;question&quot;: &quot;Name your U.S. Representative.&quot;,
            &quot;answer&quot;: &quot;Antonio Espaillat (for &gt; 110th st)&lt;br&gt;Jerry Nadler (if on UWS)&quot;
        },
        {
            &quot;question&quot;: &quot;Who does a U.S. Senator represent?&quot;,
            &quot;answer&quot;: &quot;All people of the state&quot;
        },
        {
            &quot;question&quot;: &quot;Why do some states have more Representatives than other states?&quot;,
            &quot;answer&quot;: &quot;(because of) The state’s population&lt;br /&gt;(because) They have more people&lt;br /&gt;(because) Some states have more people&quot;
        },
        {
            &quot;question&quot;: &quot;We elect a President for how many years?&quot;,
            &quot;answer&quot;: &quot;Four (4)&quot;
        },
        {
            &quot;question&quot;: &quot;In what month do we vote for President?*&quot;,
            &quot;answer&quot;: &quot;November&quot;
        },
        {
            &quot;question&quot;: &quot;What is the name of the President of the United States now?*&quot;,
            &quot;answer&quot;: &quot;Joe Biden&quot;
        },
        {
            &quot;question&quot;: &quot;What is the name of the Vice President of the United States now?&quot;,
            &quot;answer&quot;: &quot;Kamala Harris&quot;
        },
        {
            &quot;question&quot;: &quot;If the President can no longer serve, who becomes President?&quot;,
            &quot;answer&quot;: &quot;The Vice President&quot;
        },
        {
            &quot;question&quot;: &quot;If both the President and the Vice President can no longer serve, who becomes President?&quot;,
            &quot;answer&quot;: &quot;The Speaker of the House&quot;
        },
        {
            &quot;question&quot;: &quot;Who is the Commander in Chief of the military?&quot;,
            &quot;answer&quot;: &quot;The President&quot;
        },
        {
            &quot;question&quot;: &quot;Who signs bills to become laws?&quot;,
            &quot;answer&quot;: &quot;The President&quot;
        },
        {
            &quot;question&quot;: &quot;Who vetoes bills?&quot;,
            &quot;answer&quot;: &quot;The President&quot;
        },
        {
            &quot;question&quot;: &quot;What does the President’s Cabinet do?&quot;,
            &quot;answer&quot;: &quot;Advises the President&quot;
        },
        {
            &quot;question&quot;: &quot;What are two Cabinet-level positions?&quot;,
            &quot;answer&quot;: &quot;Secretary of Agriculture&lt;br /&gt;Secretary of Commerce&lt;br /&gt;Secretary of Defense&lt;br /&gt;Secretary of Education&lt;br /&gt;Secretary of Energy&lt;br /&gt;Secretary of Health and Human Services&lt;br /&gt;Secretary of Homeland Security&lt;br /&gt;Secretary of Housing and Urban Development&lt;br /&gt;Secretary of the Interior&lt;br /&gt;Secretary of Labor&lt;br /&gt;Secretary of State&lt;br /&gt;Secretary of Transportation&lt;br /&gt;Secretary of the Treasury&lt;br /&gt;Secretary of Veterans Affairs&lt;br /&gt;Attorney General&lt;br /&gt;Vice President&quot;
        },
        {
            &quot;question&quot;: &quot;What does the judicial branch do?&quot;,
            &quot;answer&quot;: &quot;Reviews laws&lt;br /&gt;Explains laws&lt;br /&gt;Resolves disputes (disagreements)&lt;br /&gt;Decides if a law goes against the Constitution&quot;
        },
        {
            &quot;question&quot;: &quot;What is the highest court in the United States?&quot;,
            &quot;answer&quot;: &quot;The Supreme Court&quot;
        },
        {
            &quot;question&quot;: &quot;How many justices are on the Supreme Court?&quot;,
            &quot;answer&quot;: &quot;Nine (9)&quot;
        },
        {
            &quot;question&quot;: &quot;Who is the Chief Justice of the United States now?&quot;,
            &quot;answer&quot;: &quot;John Roberts&quot;
        },
        {
            &quot;question&quot;: &quot;Under our Constitution, some powers belong to the federal government. What is one power of the federal government?&quot;,
            &quot;answer&quot;: &quot;To print money&lt;br&gt;To declare war&lt;br&gt;To create an army&lt;br&gt;To make treaties&quot;
        },
        {
            &quot;question&quot;: &quot;Under our Constitution, some powers belong to the states. What is one power of the states?&quot;,
            &quot;answer&quot;: &quot;Provide schooling and education&lt;br&gt;Provide protection (police)&lt;br&gt;Provide safety (fire departments)&lt;br&gt;Give a driver&apos;s license&lt;br&gt;Approve zoning and land use&quot;
        },
        {
            &quot;question&quot;: &quot;Who is the Governor of your state now?&quot;,
            &quot;answer&quot;: &quot;Kathy Hochul&quot;
        },
        {
            &quot;question&quot;: &quot;What is the capital of your state?&quot;,
            &quot;answer&quot;: &quot;Albany&quot;
        },
        {
            &quot;question&quot;: &quot;What are the two major political parties in the United States?&quot;,
            &quot;answer&quot;: &quot;Democratic and Republican&quot;
        },
        {
            &quot;question&quot;: &quot;What is the political party of the President now?&quot;,
            &quot;answer&quot;: &quot;Democrat&quot;
        },
        {
            &quot;question&quot;: &quot;What is the name of the Speaker of the House of Representatives now?&quot;,
            &quot;answer&quot;: &quot;Mike Johnson&quot;
        },
        {
            &quot;question&quot;: &quot;There are four amendments to the Constitution about who can vote. Describe one of them.&quot;,
            &quot;answer&quot;: &quot;Citizens eighteen (18) and older (can vote).&lt;br&gt;You don&apos;t have to pay (a poll tax) to vote.&lt;br&gt;Any citizen can vote. (Women and men can vote.)&lt;br&gt;A male citizen of any race (can vote).&quot;
        },
        {
            &quot;question&quot;: &quot;What is one responsibility that is only for United States citizens?&quot;,
            &quot;answer&quot;: &quot;Serve on a jury&lt;br&gt;Vote in a federal election&quot;
        },
        {
            &quot;question&quot;: &quot;Name one right only for United States citizens.&quot;,
            &quot;answer&quot;: &quot;Vote in a federal election&lt;br&gt;Run for federal office&quot;
        },
        {
            &quot;question&quot;: &quot;What are two rights of everyone living in the United States?&quot;,
            &quot;answer&quot;: &quot;Freedom of expression&lt;br&gt;Freedom of speech&lt;br&gt;Freedom of assembly&lt;br&gt;Freedom to petition the government&lt;br&gt;Freedom of religion&lt;br&gt;The right to bear arms&quot;
        },
        {
            &quot;question&quot;: &quot;What do we show loyalty to when we say the Pledge of Allegiance?&quot;,
            &quot;answer&quot;: &quot;The United States&lt;br&gt;The flag&quot;
        },
        {
            &quot;question&quot;: &quot;What is one promise you make when you become a United States citizen?&quot;,
            &quot;answer&quot;: &quot;Give up loyalty to other countries&lt;br&gt;Defend the Constitution and laws of the United States&lt;br&gt;Obey the laws of the United States&lt;br&gt;Serve in the U.S. military (if needed)&lt;br&gt;Serve (do important work for) the nation (if needed)&lt;br&gt;Be loyal to the United States&quot;
        },
        {
            &quot;question&quot;: &quot;How old do citizens have to be to vote for President?&quot;,
            &quot;answer&quot;: &quot;Eighteen (18) and older&quot;
        },
        {
            &quot;question&quot;: &quot;What are two ways that Americans can participate in their democracy?&quot;,
            &quot;answer&quot;: &quot;Vote&lt;br&gt;Join a political party&lt;br&gt;Help with a campaign&lt;br&gt;Join a civic group&lt;br&gt;Join a community group&lt;br&gt;Give an elected official your opinion on an issue&lt;br&gt;Call Senators and Representatives&lt;br&gt;Publicly support or oppose an issue or policy&lt;br&gt;Run for office&lt;br&gt;Write to a newspaper&quot;
        },
        {
            &quot;question&quot;: &quot;When is the last day you can send in federal income tax forms?*&quot;,
            &quot;answer&quot;: &quot;April 15&quot;
        },
        {
            &quot;question&quot;: &quot;When must all men register for the Selective Service?&quot;,
            &quot;answer&quot;: &quot;At age eighteen (18)&lt;br&gt;Between eighteen (18) and twenty-six (26)&quot;
        },
        {
            &quot;question&quot;: &quot;What is one reason colonists came to America?&quot;,
            &quot;answer&quot;: &quot;Freedom&lt;br&gt;Political liberty&lt;br&gt;Religious freedom&lt;br&gt;Economic opportunity&lt;br&gt;Practice their religion&lt;br&gt;Escape persecution&quot;
        },
        {
            &quot;question&quot;: &quot;Who lived in America before the Europeans arrived?&quot;,
            &quot;answer&quot;: &quot;American Indians&lt;br&gt;Native Americans&quot;
        },
        {
            &quot;question&quot;: &quot;What group of people was taken to America and sold as slaves?&quot;,
            &quot;answer&quot;: &quot;Africans&lt;br&gt;People from Africa&quot;
        },
        {
            &quot;question&quot;: &quot;Why did the colonists fight the British?&quot;,
            &quot;answer&quot;: &quot;Because of high taxes (taxation without representation)&lt;br&gt;Because the British army stayed in their houses (boarding, quartering)&lt;br&gt;Because they didn&apos;t have self-government&quot;
        },
        {
            &quot;question&quot;: &quot;Who wrote the Declaration of Independence?&quot;,
            &quot;answer&quot;: &quot;(Thomas) Jefferson&quot;
        },
        {
            &quot;question&quot;: &quot;When was the Declaration of Independence adopted?&quot;,
            &quot;answer&quot;: &quot;July 4, 1776&quot;
        },
        {
            &quot;question&quot;: &quot;There were 13 original states. Name three.&quot;,
            &quot;answer&quot;: &quot;New Hampshire&lt;br&gt;Massachusetts&lt;br&gt;Rhode Island&lt;br&gt;Connecticut&lt;br&gt;New York&lt;br&gt;New Jersey&lt;br&gt;Pennsylvania&lt;br&gt;Delaware&lt;br&gt;Maryland&lt;br&gt;Virginia&lt;br&gt;North Carolina&lt;br&gt;South Carolina&lt;br&gt;Georgia&quot;
        },
        {
            &quot;question&quot;: &quot;What happened at the Constitutional Convention?&quot;,
            &quot;answer&quot;: &quot;The Constitution was written.&lt;br&gt;The Founding Fathers wrote the Constitution.&quot;
        },
        {
            &quot;question&quot;: &quot;When was the Constitution written?&quot;,
            &quot;answer&quot;: &quot;1787&quot;
        },
        {
            &quot;question&quot;: &quot;The Federalist Papers supported the passage of the U.S. Constitution. Name one of the writers.&quot;,
            &quot;answer&quot;: &quot;(James) Madison&lt;br&gt;(Alexander) Hamilton&lt;br&gt;(John) Jay&lt;br&gt;Publius&quot;
        },
        { 
            &quot;question&quot;: &quot;What is one thing Benjamin Franklin is famous for?&quot;,
            &quot;answer&quot;: &quot;U.S. diplomat&lt;br&gt;Oldest member of the Constitutional Convention&lt;br&gt;First Postmaster General of the United States&lt;br&gt;writer of \&quot;Poor Richard&apos;s Almanac\&quot;&lt;br&gt;Started the first free libraries&quot; 
        },
        { 
            &quot;question&quot;: &quot;Who is the \&quot;Father of Our Country\&quot;?&quot;, 
            &quot;answer&quot;: &quot;(George) Washington&quot; 
        },
        {
            &quot;question&quot;: &quot;Who was the first President?&quot;,
            &quot;answer&quot;: &quot;(George) Washington&quot;
        },
        {
            &quot;question&quot;: &quot;What territory did the United States buy from France in 1803?&quot;,
            &quot;answer&quot;: &quot;The Louisiana Territory&lt;br&gt;Louisiana&quot;
        },
        {
            &quot;question&quot;: &quot;Name one war fought by the United States in the 1800s.&quot;,
            &quot;answer&quot;: &quot;War of 1812&lt;br&gt;Mexican-American War&lt;br&gt;Civil War&lt;br&gt;Spanish-American War&quot;
        },
        {
            &quot;question&quot;: &quot;Name the U.S. war between the North and the South.&quot;,
            &quot;answer&quot;: &quot;The Civil War&lt;br&gt;the War between the States&quot;
        },
        {
            &quot;question&quot;: &quot;Name one problem that led to the Civil War.&quot;,
            &quot;answer&quot;: &quot;Slavery&lt;br&gt;Economic reasons&lt;br&gt;States&apos; rights&quot;
        },
        {
            &quot;question&quot;: &quot;What was one important thing that Abraham Lincoln did?&quot;,
            &quot;answer&quot;: &quot;Freed the slaves (Emancipation Proclamation)&lt;br&gt;Saved (or preserved) the Union&lt;br&gt;Led the United States during the Civil War&quot;
        },
        {
            &quot;question&quot;: &quot;What did the Emancipation Proclamation do?&quot;,
            &quot;answer&quot;: &quot;Freed the slaves&lt;br&gt;Freed slaves in the Confederacy&lt;br&gt;Freed slaves in the Confederate states&lt;br&gt;Freed slaves in most Southern states&quot;
        },
        {
            &quot;question&quot;: &quot;What did Susan B. Anthony do?&quot;,
            &quot;answer&quot;: &quot;Fought for women&apos;s rights&lt;br&gt;Fought for civil rights&quot;
        },
        {
            &quot;question&quot;: &quot;Name one war fought by the United States in the 1900s.&quot;,
            &quot;answer&quot;: &quot;World War I&lt;br&gt;World War II&lt;br&gt;Korean War&lt;br&gt;Vietnam War&lt;br&gt;(Persian) Gulf War&quot;
        },
        {
            &quot;question&quot;: &quot;Who was President during World War I?&quot;,
            &quot;answer&quot;: &quot;(Woodrow) Wilson&quot;
        },
        {
            &quot;question&quot;: &quot;Who was President during the Great Depression and World War II?&quot;,
            &quot;answer&quot;: &quot;(Franklin) Roosevelt&quot;
        },
        {
            &quot;question&quot;: &quot;Who did the United States fight in World War II?&quot;,
            &quot;answer&quot;: &quot;Japan, Germany, and Italy&quot;
        },
        {
            &quot;question&quot;: &quot;Before he was President, Eisenhower was a general. What war was he in?&quot;,
            &quot;answer&quot;: &quot;World War II&quot;
        },
        {
            &quot;question&quot;: &quot;During the Cold War, what was the main concern of the United States?&quot;,
            &quot;answer&quot;: &quot;Communism&quot;
        },
        {
            &quot;question&quot;: &quot;What movement tried to end racial discrimination?&quot;,
            &quot;answer&quot;: &quot;Civil rights (movement)&quot;
        },
        {
            &quot;question&quot;: &quot;What did Martin Luther King, Jr. do?&quot;,
            &quot;answer&quot;: &quot;Fought for civil rights&lt;br&gt;Worked for equality for all Americans&quot;
        },
        {
            &quot;question&quot;: &quot;What major event happened on September 11, 2001, in the United States?&quot;,
            &quot;answer&quot;: &quot;Terrorists attacked the United States.&quot;
        },
        {
            &quot;question&quot;: &quot;Name one American Indian tribe in the United States.&quot;,
            &quot;answer&quot;: &quot;Cherokee&lt;br&gt;Navajo&lt;br&gt;Sioux&lt;br&gt;Chippewa&lt;br&gt;Choctaw&lt;br&gt;Pueblo&lt;br&gt;Apache&lt;br&gt;Iroquois&lt;br&gt;Creek&lt;br&gt;Blackfeet&lt;br&gt;Seminole&lt;br&gt;Cheyenne&lt;br&gt;Arawak&lt;br&gt;Shawnee&lt;br&gt;Mohegan&lt;br&gt;Huron&lt;br&gt;Oneida&lt;br&gt;Lakota&lt;br&gt;Crow&lt;br&gt;Teton&lt;br&gt;Hopi&lt;br&gt;Inuit&quot;
        },
        {
            &quot;question&quot;: &quot;Name one of the two longest rivers in the United States.&quot;,
            &quot;answer&quot;: &quot;Missouri (River)&lt;br&gt;Mississippi (River)&quot;
        },
        {
            &quot;question&quot;: &quot;What ocean is on the West Coast of the United States?&quot;,
            &quot;answer&quot;: &quot;Pacific (Ocean)&quot;
        },
        {
            &quot;question&quot;: &quot;What ocean is on the East Coast of the United States?&quot;,
            &quot;answer&quot;: &quot;Atlantic (Ocean)&quot;
        },
        {
            &quot;question&quot;: &quot;Name one U.S. territory.&quot;,
            &quot;answer&quot;: &quot;Puerto Rico&lt;br&gt;U.S. Virgin Islands&lt;br&gt;American Samoa&lt;br&gt;Northern Mariana Islands&lt;br&gt;Guam&quot;
        },
        {
            &quot;question&quot;: &quot;Name one state that borders Canada.&quot;,
            &quot;answer&quot;: &quot;Maine&lt;br&gt;New Hampshire&lt;br&gt;Vermont&lt;br&gt;New York&lt;br&gt;Pennsylvania&lt;br&gt;Ohio&lt;br&gt;Michigan&lt;br&gt;Minnesota&lt;br&gt;North Dakota&lt;br&gt;Montana&lt;br&gt;Idaho&lt;br&gt;Washington&lt;br&gt;Alaska&quot;
        },
        {
            &quot;question&quot;: &quot;Name one state that borders Mexico.&quot;,
            &quot;answer&quot;: &quot;California&lt;br&gt;Arizona&lt;br&gt;New Mexico&lt;br&gt;Texas&quot;
        },
        {
            &quot;question&quot;: &quot;What is the capital of the United States?&quot;,
            &quot;answer&quot;: &quot;Washington, D.C.&quot;
        },
        {
            &quot;question&quot;: &quot;Where is the Statue of Liberty?&quot;,
            &quot;answer&quot;: &quot;New York (Harbor)&lt;br&gt;Liberty Island&lt;br&gt;[Also acceptable are New Jersey, near New York City, and on the Hudson (River).]&quot;
        },
        {
            &quot;question&quot;: &quot;Why does the flag have 13 stripes?&quot;,
            &quot;answer&quot;: &quot;Because there were 13 original colonies&lt;br&gt;Because the stripes represent the original colonies&quot;
        },
        {
            &quot;question&quot;: &quot;Why does the flag have 50 stars?&quot;,
            &quot;answer&quot;: &quot;Because there is one star for each state&lt;br&gt;Because each star represents a state&lt;br&gt;Because there are 50 states&quot;
        },
        {
            &quot;question&quot;: &quot;What is the name of the national anthem?&quot;,
            &quot;answer&quot;: &quot;The Star-Spangled Banner&quot;
        },
        {
            &quot;question&quot;: &quot;When do we celebrate Independence Day?&quot;,
            &quot;answer&quot;: &quot;July 4&quot;
        },
        {
            &quot;question&quot;: &quot;Name two national U.S. holidays.&quot;,
            &quot;answer&quot;: &quot;New Year&apos;s Day&lt;br&gt;Martin Luther King, Jr. Day&lt;br&gt;Presidents&apos; Day&lt;br&gt;Memorial Day&lt;br&gt;Juneteenth&lt;br&gt;Independence Day&lt;br&gt;Labor Day&lt;br&gt;Columbus Day&lt;br&gt;Veterans Day&lt;br&gt;Thanksgiving&lt;br&gt;Christmas&quot;
        }
    ]

    $(document).ready(function() {    
        console.log(&quot;running this thing?&quot;)
        $(&quot;#regenerate-question&quot;).click(function() {
            var randomIndex = Math.floor(Math.random() * questionsAndAnswers.length);
            console.log(&quot;RandomIndex is &quot;, randomIndex);
            $(&quot;#question&quot;).text(questionsAndAnswers[randomIndex][&apos;question&apos;])
            $(&quot;#answer&quot;).hide();
            $(&quot;#answer&quot;).html(questionsAndAnswers[randomIndex][&apos;answer&apos;])
        });

        $(&quot;#show-answer&quot;).click(function(){
            $(&quot;#answer&quot;).show();
        })
    });
&lt;/script&gt;
</content>
 </entry>
 
 <entry>
   <title>Managing Documents In a Hybrid World</title>
   <link href="http://maltzj.github.io/posts/managing-documents-in-a-hybrid-world"/>
   <updated>2023-04-25T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/managing-documents-in-a-hybrid-world</id>
   <content type="html">&lt;p&gt;When teams shifted to remote + hybrid work, they also needed to adopt a much
greater emphasis on having a written culture.  On our team, this came with an
additional problem: we ended up with so many documents it was hard for us to
understand which ones were important/unimportant.  Shortly after that, we had a
new manager joining our team and he gave us a few tools to manage this document
explosion.&lt;/p&gt;

&lt;h2&gt;Tool #1: Clarify The purpose of the Document Via Emojis&lt;/h2&gt;
&lt;p&gt;The first challenge tackled was that documents take on many purposes.  Without any
clear signal for “this is what this document is intended to do” it was hard for
readers to differentiate “here’s a half-baked idea that I’d love 30% feedback
on” from “this is a design document that we’re now implementing”.  To fix that,
we created a simple emoji-based taxonomy for all of our documents. The system worked as follows.&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;A 💻 represented a design documents, and were assumed to express “here
        is a thing I am planning to build”.&lt;/li&gt;
    &lt;li&gt;A 👀 represented a “validate my perspective” document.  These could be
        anything from “Here’s a wild idea I had for a team process change” to “a
        rough cut of what our next quarters OKRs should be before we go into
        planning”.&lt;/li&gt;
    &lt;li&gt;A 🌅 represented a vision document.  These could either be technical
        vision or product vision.  Either way, they were not assumed to
        represent exactly what we were build, but directionally were we were
        going.&lt;/li&gt;
    &lt;li&gt;A Gavel emoji represented a decision document and expressed “here is
        some decision which needs to be made outside the scope of a design
        document”.  It could be a technical decision (“how will we scale the foo
        service”) or a team process decision (“how frequently will we hold
        sprint planning”)&lt;/li&gt;
    &lt;li&gt;A 🗒️ emoji represented meeting notes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Taken together, this simple taxonomy helped readers who stumbled across some
random document clarify “how should I reason about this”.&lt;/p&gt;

&lt;h2&gt;Tool #2: Store All Documents of a Particular Type In a Folder&lt;/h2&gt;

&lt;p&gt;Once we had a taxonomy, we then created a simple system for organizing
documents according to their type.  We started out by organizing according to
type (all 👀 would go into one folder, 🌅 into another, etc.) but we found this
to be a little overwhelming as time went on.  Instead we moved to a simple
format where largeish projects would have their own folder where all documents
lived (often with &lt;a
                          href=&quot;http://maltzj.com/posts/hub-and-spokes-model-for-documentation&quot;&gt;a single
                          “hub” document&lt;/a&gt; as an anchor) while other documents
                      (small design documents, unrelated &quot;validate my
                      perspective documents&quot;, etc.) would go into the shared
folder.&lt;/p&gt;

&lt;p&gt;This proved to be very helpful because we found document search in most tools
works ~75% of the time.  We often found ourselves knowing “oh yeah, I had a
gavel document for that somewhere” or “I think someone wrote a vision document
for that” but not knowing the exact search incantation to find it.  By having a
simple folder structure to store documents we were able to save a lot of time
hunting for documents.  This also played nicely with icons, as we could easily
look at any document without a folder, look at its icon, and know where it
needed to be moved to.&lt;/p&gt;

&lt;h2&gt;Tool #3: Clarify Status at the Top of Each Document&lt;/h2&gt;

&lt;p&gt;After those two changes, we adopted was having a simple “status” box at the top of each
document.  This status box was a  one cell table which contained the
author, the date the document was updated, and a status of the document (whether
it was early draft, ready for review, or just some rough scribbles on a page).
In practice it looked like this.&lt;/p&gt;

&lt;table border=&quot;1px&quot;&gt;
    &lt;tr&gt;
        &lt;td&gt;
            &lt;b&gt;Author:&lt;/b&gt; Maltz&lt;br /&gt;
            &lt;b&gt;Status:&lt;/b&gt; Very early draft.  Believed to be directionally
            correct, but not ready for feedback yet.&lt;br /&gt;
            &lt;b&gt;Last Updated:&lt;/b&gt; Apr 25, 2023 &lt;br /&gt;
        &lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;
&lt;br /&gt;


&lt;p&gt;By clarifying when a document was ready for feedback and when it was last
updated, readers could understand what level of feedback was appropriate for the
current document status.  This helped us in a couple of concrete ways:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;It prevented some classes of thrash where someone would write a spicy
        “validate my perspective” document, share it with a couple of people,
        and then forget about the document.  Someone would then find the
        document 6 months later and get heartburn that some big change was
        happening.&lt;/li&gt;
    &lt;li&gt;It prevented people from finding a design document that was 30% complete
        and giving it fine-toothed-comb feedback even when it wasn’t ready for
        that.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In both of these cases, the presence of a simple “status” box helped readers
contextualize “how much should I care about this” and “how should I engage with
this document”.&lt;/p&gt;

&lt;p&gt;In practice we didn’t enforce a strict policy on keeping these fields up to
date, but documents which tended towards adoption would get the fields updated
naturally just through sheer number of eyeballs.&lt;/p&gt;

&lt;h2&gt;Tool #4: Clarify expected approvers when necessary&lt;/h2&gt;

&lt;p&gt;Once we had this taxonomy, we encountered one other problem: for documents
which were trying to drive towards a “decision” (i.e. Gavel documents or design
documents) it would be unclear who was responsible for actually saying “this
decision has been made”.  We solved that by adding a small section at the top
called the “Gavel Block”.  This was a simple list of people who needed to
approve and could check-off their names or add blocking feedback.&lt;/p&gt;

&lt;p&gt;This practice was again simple but very helpful for clarifying the &lt;a
                                                                              href=&quot;https://project-management.com/understanding-responsibility-assignment-matrix-raci-matrix/&quot;&gt;RACI
                                                                              Matrix&lt;/a&gt; around a particular document.  If your name wasn’t on the gavel block,
you didn’t have to review.  Similarly, if you came through with feedback and
wasn’t on the gavel block, then the author could easily clarify “do you want to
be on the gavel block” or “is this non-blocking feedback”.&lt;/p&gt;


&lt;p&gt;These tools didn’t solve all of our challenges related to having a heavily
written culture, but they did help our team operate substantially more
effectively.  Plus, they were lightweight and easy to adopt.  If your team is
struggling to sift through a pile of documents they’re probably worth a try for
you as well.&lt;/p&gt;

&lt;em&gt;A big thank you to &lt;a href=&quot;https://www.linkedin.com/in/marcweil/&quot;&gt;Marc
        Weil&lt;/a&gt; who both reviewed a draft of this and helped us implement these changes!&lt;/em&gt;
</content>
 </entry>
 
 <entry>
   <title>A Hub and Spokes Model for Documentation on Large Projects</title>
   <link href="http://maltzj.github.io/posts/hub-and-spokes-model-for-documentation"/>
   <updated>2023-03-30T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/hub-and-spokes-model-for-documentation</id>
   <content type="html">&lt;p&gt;As projects grow it can be difficult to keep track of all of the
documentation associated with them.  Between product requirements documents,
design documents, meeting notes, and &lt;a href=&quot;https://adr.github.io/&quot;&gt;architecture decision
    records&lt;/a&gt; it can be easy to find yourself lost in a forest of Google
Documents trying to find that one document which has the information you need.
A while ago a friend told me about a simple model to manage this complexity on
large projects, something he called &quot;the hub and spokes&quot; model of
project documentation.&lt;/p&gt;

&lt;h2&gt;How&apos;s it work?&lt;/h2&gt;

&lt;p&gt;The basic idea of the hub-and-spokes model is simple: you create a central
document (a hub) which serves as an entrypoint into the project.  Oftentimes
this is some central &quot;why are we doing this thing&quot; document like a product
requirements document or a project brief.  You then use that to link out to
smaller documents (notes, decision logs, scoping documents) which describe a more focused
topic.  Within the more focused document you include a backlink to the &quot;hub&quot; so
that folks can walk up the stack.&lt;/p&gt;

&lt;p&gt;This approach isn&apos;t necceary in tools like Confluence which
automatically create a documentation tree, but they take a little more
discipline when you&apos;re just using a raw documents tool like Google Docs.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>How Teams Change At Different Sizes</title>
   <link href="http://maltzj.github.io/posts/notable-change-points-in-team-sizes"/>
   <updated>2023-02-26T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/notable-change-points-in-team-sizes</id>
   <content type="html">&lt;p&gt;During my career I&apos;ve had the chance to work on teams of a lot of different
sizes. During that time I&apos;ve come to realize there are really six &quot;buckets&quot; of
team sizes.  At each bucket, ICs + team leads need to operate a little
differently in order to be successful within those teams.  The sizes are:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;b&gt;1 Person&lt;/b&gt;: Do what you want, YOLO&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;2 → 3 People&lt;/b&gt;: An ideal small squad.  Team can stay in touch with
        daily slack-ups and maybe an ad-hoc meeting when necessary.  In a remote
        world you probably need a weekly sync, but in-person that may not be
        necessary.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;4 → 5 People&lt;/b&gt;: The size at which &quot;which get everyone into a room&quot;
        is a productive strategy whenever you have a challenge.  This is the
        size at which one seems to be able to tech lead and  manage as well. 
        You probably need a weekly sprint planning meeting to get on the same
        page because you&apos;ve split into two squads.  This also  conveniently
        lines up with the first of &lt;a
                                           href=&quot;https://www.newyorker.com/science/maria-konnikova/social-media-affect-math-dunbar-number-friendships&quot;&gt;Dunbar&apos;s
                                                                                                                numbers.&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;6 → 9 people&lt;/b&gt;: The platonic team size.  One manager, eight
        engineers, maybe a product manager.  Order your two pizzas, appreciate
        the fact that you have a good balance of size and redundancy, and
        execute away.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;10 → 12 people&lt;/b&gt;: Team has likely become a little sprawling but may
        not have an exact obvious cut point.  Often characterized by needing to
        share lots of context between people because of the broad scope, and a
        manager who is being pulled in a bunch of directions.  Team is strained,
        but not breaking.  Chances are ICs will be doing some &quot;gap filling&quot; to
        make sure the team communicates well here.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;13+ people&lt;/b&gt;: GG.  This isn&apos;t even a team anymore; just an
        overwhelmed manager and a bunch of sub-teams who secretly need to break
        off, but they can&apos;t, either because there&apos;s no one to manage the right
        sub-teams or the boundaries between &quot;what should be the sub-teams&quot; are
        not clear.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of course, these aren&apos;t THE ONLY team models that exist, but I find them to
be generally useful baseline rules when thinking about &quot;how should I operate
within a team&quot;&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>When Should You Spend Time on Technical Vision</title>
   <link href="http://maltzj.github.io/posts/lacking-tech-vision"/>
   <updated>2022-12-04T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/lacking-tech-vision</id>
   <content type="html">&lt;p&gt;One of the challeging things about being a technical leader is knowing how
much time to spend on big-picture vision setting vs. writing code and solving
the problems of today.  Spend too much time on vision setting and you may start
designing solutions which are disconnected from reality.  However, if you don&apos;t
spend enough time on vision your team will sputter over the long-term.  Over the
last couple of years I&apos;ve found a few heuristics to apply which let you know
when it&apos;s time to jump into &quot;vision setting mode&quot;.&lt;/p&gt;

&lt;h2&gt;What&apos;s Technical Vision&lt;/h2&gt;

&lt;p&gt;Before digging into &lt;em&gt;when&lt;/em&gt; you need to spend more time setting a
technical vision, it&apos;s important to understand &lt;em&gt;what&lt;/em&gt; a technical vision
looks like.  A technical vision can take many forms, but it&apos;s most often an
aspirational document (frequently ~2 -&gt; 5 pages) which outlines an ideal future
technical state that a team will achieve over the next 18+ months.  Technical
visions are useful as an anchor point in the &lt;a
href=&quot;https://medium.com/@jamesacowling/stepping-stones-not-milestones-e6be0073563f&quot;&gt;cone
of strategy&lt;/a&gt; to help tie-break day-to-day technical decisions.  They rarely
end up being exactly correct, but they can also serve as a useful tool to
                                                     elucidate any large gaps in
                                                     what your team is currently
                                                     building and help the team
                                                     take a first step towards
                                                     fixing those gaps.&lt;/p&gt;

&lt;h2&gt;What are The Signs You Need To Spend Time Clarifying Your Technnical
Vision&lt;/h2&gt;

&lt;p&gt;All of those things seem great, so why not just spend all of your time on
technical vision?  Unfortunately, creating one comes with a cost. The first cost
is obvious: drafting and building consensus around a vision takes substantial
amount of time from the author and reviewers to make sure the vision is
directionally correct.  Vision documents &lt;em&gt;also&lt;/em&gt; come with a cost for the
team.  Once drafted, you actually need to get the team to shift course and use
that vision in their day to day decision making.  While this is useful, it also
takes time, and can lead to a feeling of whiplash if the team feels like they&apos;re
changing their north star too frequently.  So, what are some cues you can use to
know that it&apos;s time to pay this cost and draft a technical vision?&lt;/p&gt;

&lt;h3&gt;Case #1: When people are constantly disagreeing over small changes&lt;/h3&gt;

&lt;p&gt;One of the first signs that the team needs a clearer technical vision is if
the team is constantly getting bogged down in small design decisions.  While
some design push-and-pull is to be expected on code reviews and design
documents, the team should spend most of their day-to-day time discussing
questions on the margins rather than constantly re-litigating core questions
about what you&apos;re building. &lt;/p&gt;

&lt;p&gt;If you start to see the team having these &quot;re-litigate the world&quot; discussion
frequently, chances are there&apos;s a few key underlying architectural decisions
which the team has not investigated and decided upon.  Drafting a technical
vision can help bring these disagreements to the forefront and allow the team
to come to a consensus about how to architect a solution to these problems.
While the vision won&apos;t magically solve all design disagreements, having an
agreed-upon north star should prevent the team from churning on the same design
issues every code review.&lt;/p&gt;

&lt;h3&gt;Case #2: When team discussions become sprawling&lt;/h3&gt;

&lt;p&gt;Sometimes teams will encounter a situation where they can make design
decisions effectively, but it feels like many decisions are time-consuming
because they require &quot;inventing the architecture as they go&quot;.  In these
situations, the problem isn&apos;t so much disagreement so much as confusion about
how all of the pieces of the system should fit together.  This means that simple questions
like &quot;how should we deploy this thing&quot; becoming sprawling discussions without
about &quot;well how do we even &lt;em&gt;want to use&lt;/em&gt; Jenkins here&quot;.  While some
amount of this type of &quot;zoom out&quot; thinking is useful, if you find it&apos;s slowing
down the team it may be time to invest in clarifying your technical vision.&lt;/p&gt;

&lt;p&gt;Resolving vision gaps in these cases is often slightly different than in Case
#1, as there may not be any core disagreements to resolve.  Instead, it may just
be a case of a team having differing expertise, and no one has yet stitched all
of the moving pieces into a coherent narrative.  As a result, in these cases may
have less disagreement-resolution, and more stitching-together disparate pieces
of context into a coherent whole.&lt;/p&gt;

&lt;h3&gt;Case #3: When you&apos;ve hit a local maximum&lt;/h3&gt;

&lt;p&gt;Sometimes it becomes clear that your current way of doing things just won&apos;t
work.  Maybe you&apos;re constantly firefighting bugs in your infrastructure, or
maybe your customer requests are becoming progressively harder to implement.
Regardless of the symptoms, if your team is churning through problems as best it
can, but it seems like you&apos;re stil falling behind, chances are you need to do a
clarify your technical vision and chart a path to something fundamentally better.&lt;/p&gt;

&lt;p&gt;These types of technical vision can feel a little different than ones created
for the other two cases.  They will still chart a course to a glorious future,
but they also need to come with a concrete first step (&quot;we will start
on this vision by doing X to solve our immediate scalability needs&quot;) which helps
the team out of its current situation.&lt;/p&gt;


&lt;p&gt;These three cases aren&apos;t the only times teams will need to
clarify their technical vision, they do represent three common cases to look out
for.  So, if you find yourself repeatedly bogged down in the same technical
discussions, struggling to fit together a number of disparate design decisions
into a coherent story, or just stuck in a technical rut, it&apos;s worth asking
yourself &quot;does our team have a clear enough vision about how to solve this
problem&quot; and filling that gap if not.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Collaborating Effectively By Focusing on Understanding</title>
   <link href="http://maltzj.github.io/posts/collaborating-well"/>
   <updated>2021-05-16T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/collaborating-well</id>
   <content type="html">&lt;p&gt;A while back a friend gave me some important, but hard to hear feedback.  She
told me something to the effect of &quot;you always assume other people are wrong,
and it limits your ability to collaborate with people.&quot;  I&apos;d always considered
myself a strong collaborator, so hearing that I actually had a long way to go was humbling.  
For the rest of the year I worked on breaking this habit with a simple mental
framework: whenever I&apos;m surprised by something, assume
that the other person has already done what they believe to be the exact right
thing.&quot;  This simple idea was incredibly powerful for pretty much everywhere,
but it&apos;s most handy in a few situations.&lt;/p&gt;

&lt;h2&gt;Project check-ins&lt;/h2&gt;

&lt;p&gt;When leading a project, it&apos;s common for something to take longer than expected.
It&apos;s my job as a project lead to figure out how to unblock that.  One way to do
that is just ask &quot;Hey Albert, what&apos;s the status on your piece of this project?&quot;.
This is fine, but it also communicates &quot;Albert, you have done a bad job on
keeping people up to date on what&apos;s happening, and now I&apos;m worried about it.&quot;
It also doesn&apos;t put me in a position to actually help with anything that&apos;s going
on.&lt;/p&gt;

&lt;p&gt;Alternatively, I could ask &quot;Hey Albert, how is your piece of the project going?
Is there any way I can help move this faster?&quot;  Suddenly my question is no
longer adversarial.  Now I&apos;m trying to figure out if there&apos;s any way we can move
the project forward together.  Maybe Albert will say &quot;nope, this particular bug
is really kicking my butt&quot; and I can offer to pair, or maybe he will say &quot;I keep
getting random asks from another team, and that&apos;s distracting&quot; and I can work
with them to prioritize asks appropriately.  Whatever it is, by explicitly
offering to help rather than &quot;just checking in&quot; I&apos;ve put trust in Albert and
opened the door for a rich dialog about how we can effectively collaborate.&lt;/p&gt;

&lt;h2&gt;Design documents&lt;/h2&gt;

&lt;p&gt;Oftentimes I&apos;ll look at a design document and think &quot;this decision seems wrong,
they should be doing it another way&quot;.  The naive way to approach this is to say
&quot;Samantha, this approach seems unscalable, we should do a different approach&quot;.
However, this approach starts from the asusmption that Samantha is wrong and has
made a poor decision.&lt;/p&gt;

&lt;p&gt;If we instead start from the assumption that Samantha has made the right
decision, our feedback looks like &quot;This approach is surprising, as it seems like
it would be less scalable then ${SOME-OTHER-APPROACH}, why are we doing things
this way?&quot;  Suddenly my feedback isn&apos;t adversarial!  Samantha can now say
&quot;That&apos;s a good point!  I&apos;ll fix that.&quot;, or she may say &quot;we considered that, but
abandoned it for XYZ reasons&quot;.  Whatever the answer, we can discuss it from a
perspective of mutual understanding rather than oppositional disagreements.&lt;/p&gt;


&lt;p&gt;As with all things this approach isn&apos;t perfect.  There are sometimes where
you just need to come in and drop the proscriptive-hammer and say &quot;this isn&apos;t
happening&quot;.  Communicating this way also takes a little extra time, and may not
be ideal for people who are used to a more direct mode of disagreement.
However, I&apos;ve found that taking a default posture of &quot;this person isn&apos;t wrong, I
just don&apos;t get it yet&quot; my conversations are much more productive and
collaborative.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Some thoughts on "organizational neutral"</title>
   <link href="http://maltzj.github.io/posts/organizational-neutral"/>
   <updated>2021-04-03T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/organizational-neutral</id>
   <content type="html">&lt;p&gt;Recently I had a shower-thought about the concept of &quot;organizational
neutral&quot;.  &quot;Organizational neutral&quot; in my mind can be contrast with
&quot;Organizational fifth gear&quot;.  You know you&apos;re in fifth gear when people are
trying to pour gas on whatever thing you&apos;re working on.  Users are flooding you
with feature requests, your part of the org is getting as much headcount as you
want, and people are generally very excited about what you have going on.  The
problem when you&apos;re in &quot;fifth gear&quot; is that you need to pick a generally correct
set of things to work on and make sure that people are not stepping on each
other&apos;s toes too much (there&apos;s probably a separate version of this for
hypergrowth, where you just point a mass of people in the generally right
direction and pray).&lt;/p&gt;

&lt;p&gt;The other opposite to &quot;organizational neutral&quot; is &quot;stopped&quot; or even
&quot;reverse&quot;.  This is what happens when you keep suggesting ideas and people go
off and do the opposite.  Your manager starts having very direct conversations
with you saying &quot;don&apos;t do that&quot; and you aren&apos;t getting any traction.  When
you&apos;re in &quot;stopped&quot;, the key is to recognize the signs, stop what you&apos;re doing,
and re-orient to figure out how to do more correct things.&lt;/p&gt;

&lt;p&gt;Organizational neutral is neither of these.  It&apos;s a no-mans-land between
&quot;let&apos;s double down&quot; and &quot;stop doing what you&apos;re doing&quot;.  No one is telling you
to stop, and you&apos;re occasionally getting positive signals, but people aren&apos;t
banging on your door to buy whatever it is you&apos;re selling. Getting out of
neutral is hard, because there&apos;s &lt;a
                                     href=&quot;https://blog.danielna.com/talks/pushing-through-friction/&quot;&gt;friction&lt;/a&gt; in almost any direction.  You need to
apply focused energy to get out of neutral, but it&apos;s unclear where to apply that
energy.  You don&apos;t have anyone in the organization telling you where to go, and
it feels like making anything real happen requires much more energy or staffing
than you have available. These are often problems shaped like &quot;cultural change&quot;,
which can&apos;t happen just by flipping a switch in code.&lt;/p&gt;

&lt;p&gt;I think the key to us getting out of neutral is to very publicly do cheap
things that didn&apos;t require any additional permission.  Some things that don&apos;t
require anyone&apos;s permission include:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Holding meetings&lt;/li&gt;
    &lt;li&gt;Giving presentations&lt;/li&gt;
    &lt;li&gt;Writing prototypes&lt;/li&gt;
    &lt;li&gt;Collecting lots of data&lt;/li&gt;
    &lt;li&gt;Writing documents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By contrast, things that do require permission include:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Staffing long-running projects&lt;/li&gt;
    &lt;li&gt;Changing team process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The name of the game is been to do things that don&apos;t require anyone&apos;s
permission, show that they matter to decision makers, and then gain permission
to make larger changes based on our successes.  The other key part has
been doing all of this very publicly.  When you&apos;re trying to get out of neutral,
one of the biggest challenges is to get other people to care.  Taking an effort
from 1 → 2 people gives you WAY MORE than a factor or 2 speed up, or at least it
feels like it does.  Being incredibly public with the work that we&apos;re doing +
how to find us increases your luck surface area; it doesn&apos;t guarantee that
you&apos;ll happen to stumble across a partner-in-crime, but it certainly makes it
much more possible.&lt;/p&gt;

&lt;p&gt;So, how do you get out of &quot;organizational neutral&quot;.  Place lots of very
public small bets by doing things that don&apos;t require any permission.  See where
you get positive feedback and double-down on those areas to recruit allies.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Some Thoughts on Rules Engines</title>
   <link href="http://maltzj.github.io/posts/rules-engines"/>
   <updated>2021-02-21T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/rules-engines</id>
   <content type="html">&lt;p&gt;Spend enough time working with domain experts on a problem and someone is bound
to say &quot;we should build a rules engine to solve this problem.&quot;  Often this comes
along with the goal of letting domain experts express rules themselves rather
than having to evolve engineers.  However, once you start to dig into this
problem you&apos;ll discover that &quot;rules engine&quot; can mean many different things to
many different people.&lt;/p&gt;

&lt;p&gt;I&apos;ve seen this problem a few times over the past couple of years, and I&apos;ve
come to think it&apos;s useful to break down your rules engine across a few important axes.
Doing this will allow you to have clear discussions on what problems you need to
solve and what you need to build to solve them.&lt;/p&gt;

&lt;h2&gt;The questions&lt;/h2&gt;

&lt;ul&gt;
    &lt;li&gt;
        &lt;b&gt;What data do your rules have access to?&lt;/b&gt; Do your rules need to
        arbitrarily grab data from a database, or are there a set of well-defined
        features that people need to express their rules?
    &lt;/li&gt;
    &lt;li&gt;
        &lt;b&gt;When will your rules run?&lt;/b&gt; Do they run on every request? When some
        set of known events happen within your system? Whenever a data pipeline
        kicks off?
    &lt;/li&gt;
    &lt;li&gt;
        &lt;b&gt;What actions will your rules take when they pass?&lt;/b&gt; Do they just
        need to output true/false, or do they need to output some more complex
        actions?  If the latter, what do you do when a set of rules conflict?
    &lt;/li&gt;
    &lt;li&gt;
        &lt;b&gt;How complex are the rules you want to express?&lt;/b&gt; Do you essentially
        want to run arbitrary logic to match rules, or do you have a set of
        simple if/else conditions that you need to follow?
    &lt;/li&gt;
    &lt;li&gt;
        &lt;b&gt;How do you want to express your rules?&lt;/b&gt; Is abstractions in a
        programming language okay?  Or do you need something simpler?
    &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these taken together form a set of constraints for your rules engine.
If you want to express arbitrary logic over arbitrary data, well then you&apos;re
probably doing to need to write a &lt;a
                                      href=&quot;https://martinfowler.com/bliki/BusinessReadableDSL.html&quot;&gt;business
                                      readable DSL&lt;/a&gt; or use something like &lt;a
href=&quot;https://www.drools.org/&quot;&gt;drools&lt;/a&gt;. If you can simplify across some
dimension, you can probably save yourself some work .&lt;/p&gt;

&lt;h2&gt;Looking at this in practice&lt;/h2&gt;

&lt;p&gt;Let&apos;s think about how all this works in practice by using a few examples.&lt;/p&gt;

&lt;h3&gt;Radar from Stripe&lt;/h3&gt;

&lt;p&gt;Stripe&apos;s Radar product &lt;a href=&quot;https://stripe.com/docs/radar/rules&quot;&gt;has a rules
engine&lt;/a&gt; which allows merchants to configure how they should handle charges. It
answers the above questions in the following ways:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;b&gt;What data do your rules have access to?&lt;/b&gt; A constrained set of
    features that Stripe provides.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;When will your rules run?&lt;/b&gt; On every charge to your business.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;What actions will your rules take when they pass?&lt;/b&gt; Block, allow,
    review, or request 3DS for the charge. Conflicts are resolved by choosing
    the first rule that decided on an action.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;How complex are the rules you want to express?&lt;/b&gt; Fairly simple, a
    few if/else conditions.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;How do you want to express your rules?&lt;/b&gt; A simplified DSL that any
    non-engineer can configure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach constrains users across almost every dimension, but the
resulting rules engine is simple enough that almost anyone can use it.&lt;/p&gt;

&lt;h3&gt;FXL From Facebook&lt;/h3&gt;

&lt;p&gt;At the other end of the spectrum is &lt;a
href=&quot;https://www.facebook.com/notes/10158791577587200/&quot;&gt;FXL&lt;/a&gt;, a language
that Facebook developed for fighting spam.  It has slightly different answers to
these questions.&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;b&gt;What data do your rules have access to?&lt;/b&gt; &quot;A Multitude&quot;. We don&apos;t
        know for sure, but probably more than the O(10s) of features radar
        allows.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;When will your rules run?&lt;/b&gt; Presumably something like &quot;whenever a
    content creation request comes in.&quot;&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;What actions will your rules take if they pass?&lt;/b&gt; They may log
    requests, block posts, or warn users. Other actions and conflict resolution
    is undefined.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;How complex are the rules you want to express?&lt;/b&gt; Seems like they
    can get quite complicated.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;How do the rules get expressed?&lt;/b&gt; A hand-rolled language called
    FXL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FXL&apos;s rules engine gives users more power at the expense of some complexity.
The rules are actual code rather than fancy configuration. This creates spam
fighting superpowers at the price of it being harder for non-engineers to
interact with write.&lt;/p&gt;

&lt;h3&gt;SQL-Based Rules Engines&lt;/h3&gt;

&lt;p&gt;Another common pattern is the SQL-based rules engine, which &lt;a
href=&quot;https://medium.com/@siddhesh.jog/an-sql-based-rule-engine-6a187e2d88d8&quot;&gt;has an example
here&lt;/a&gt;.  The general idea of these is often &quot;our domain-experts already
understand SQL, so let&apos;s allow them to just write their rules in a language they
know.&quot;  Again, this can fit into our framework.&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;b&gt;What data do your rules have access to?&lt;/b&gt; Anything in your
    database.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;When will your rules run?&lt;/b&gt; Probably in response to a web request.
    &lt;li&gt;&lt;b&gt;What actions will your rules take if they pass?&lt;/b&gt; Some set of
    actions defined as stored procedures.  Resolution is again unclear.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;How complex are the rules you want to express?&lt;/b&gt; Not crazy simple,
    but also not crazy complicated as well.  We could probably express some
    pretty complex stuff in raw SQL if we needed to though.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;Hwo do the rules get expressed?&lt;/b&gt; SQL statements that follow a
    well-defined form.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These approaches fit somewhere in between the two approaches above.  They
seem useful when you want to return a simple classification result,
but it may get more challenging if you want to take more complex actions.&lt;/p&gt;

&lt;h2&gt;Using the framework&lt;/h2&gt;

&lt;p&gt;I&apos;m not totally sure &lt;em&gt;exactly&lt;/em&gt; how to use this framework yet, but it
has been useful for me to ask these questions whenever someone says &quot;we need a
rules engine.&quot;  I hypothesize that if you want to keep the expression language
simple, you&apos;ll need to invest more engineering-time to provide curated data to
your rules engine and limit what it can do.&lt;/p&gt;  

&lt;p&gt;I also imagine that these approaches can be mixed-and-matched for maximum
effectiveness. For example, you could have a rules engine which is based on a
business readable DSL, and provide some tooling for non-engineers to create for
common use-cases.  This allows for iteration speed in the common case without
sacrificing power when you really need something complex.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Communicating through uncertainty</title>
   <link href="http://maltzj.github.io/posts/communicating-through-uncertainty"/>
   <updated>2020-05-25T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/communicating-through-uncertainty</id>
   <content type="html">&lt;p&gt;Recently I&apos;ve found myself in situations where there&apos;s no right answer. In
these situations it can be hard to know how to proceed and even when you do make
some decision, it can be hard to communicate that to a team in a way that builds
confidence in spite of the uncertainty. I&apos;ve recently been watching some great
leaders do this, and I&apos;ve found that doing it well boils down to a few simple
steps.&lt;/p&gt;

&lt;ul&gt; &lt;li&gt;It makes it clear that a decision has been made&lt;/li&gt; &lt;li&gt;It makes it
        clear that trade-offs have been considered&lt;/li&gt; &lt;li&gt;It describes
        when/how the decision will be re-evaluated&lt;/li&gt; &lt;li&gt;It follows up&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;It makes it clear that a decision has been made&lt;/h2&gt;

&lt;p&gt;In situations with lots of uncertainty there are often lots of different
approaches and disagreement about the correct path.  Once you’ve made a decision
about which path to take, it’s important to communicate  that as a decision
being made, and not an opinion for further debate.  For people used to building
consensus this can feel overly dictatorial, &lt;a
href=&quot;https://randsinrepose.com/archives/mandate-dissect/&quot;&gt;but making it clear
that a decision has been made&lt;/a&gt; often helps the silent majority, and allows
you to stop arguing and start getting more data.&lt;/p&gt;

&lt;h2&gt;It makes it clear that all angles have been considered&lt;/h2&gt;

&lt;p&gt;Decisions in ambiguous situations are bound to have some dissenters. For
many, their natural reaction to things not going their way will be &quot;X just
doesn&apos;t understand this problem so they’re making a bad decision&quot; or even worse
&quot;X is actively out to make my life hard&quot;.  Both of these erode trust, and you
want to prevent these sentiments.  The best way to do this is to make it clear
that you’ve heard the objections and you still feel this is the correct
path.&lt;/p&gt;

&lt;h2&gt;It says when + how the decision will be evaluated&lt;/h2&gt; &lt;p&gt;One of the best
ways to get more people onboard with a decision is to communicate them as an
“let’s try it” experiment rather than a choice etched in stone.  You can do this
by describing your approach as a hypothesis being tested with clear criteria and
an evaluation date. This is particularly helpful in calming dissenters as it
gives them a clear point where the team can re-litigate the issue if this
approach turns out disastrous.&lt;/p&gt;

&lt;h2&gt;It follows-up&lt;/h2&gt;

&lt;p&gt;Once the decision has been made and it&apos;s been evaluated, it&apos;s important to
follow-up with the results and next steps. This serves two benefits. First, it
    prevents you from &lt;a
        href=&quot;https://m.signalvnoise.com/dont-scar-on-the-first-cut/&quot;&gt;scarring
        on the first cut&lt;/a&gt; and accidentally encoding an ineffective experiment
    as permanent policy. Secondly, it builds trust so that when you suggest
    future experiments, people can trust that you&apos;re not making a permanent
    change under the guise of “an experiment”.&lt;/p&gt;

&lt;p&gt;You’ll definitely want to follow-up and share out results at the end of your
        experiment, and depending on its impact you may want to check-in a week
        or two after the experiment starts, just to let people know that
        concerns are being heard and small course corrections are being
        taken.&lt;/p&gt;

&lt;h2&gt;An Example&lt;/h2&gt; &lt;p&gt;To think about how that works in practice, let&apos;s consider
a common problem.  Your team has started shipping more bugs to production. Lots
of people have theories about how to fix this, ranging from hiring a QA team to
just shrugging their shoulders and saying &quot;bugs are a fact of life&quot;. You have
decided to try to resolve this by putting a pre-push hook which ensures that
code coverage is about 50% for any new pull request. Let&apos;s look at how to
message that, starting first with the simplest message.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hey team, just wanted to give everyone a heads up that starting Monday
    we&apos;ll block any pull request which has less than 50% code coverage.
    Hopefully this will decrease the amount of bugs we ship to
production.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is a fine approach, and it scores well on making it clear that a
decision has been made. At the same time, it doesn’t show what alternatives have
been considered or how that decision is being evaluated.  This may create
critiques like: &quot;code coverage is a terrible metric&quot;, &quot;this will never decrease
our bug rate fast enough&quot;, or “a QA team would be better”.  The people with
these critiques may also have FUD that you’re enshrining a bad choice without
considering all angles. Let&apos;s think about how to resolve that.&lt;/p&gt;

&lt;p&gt;&lt;em&gt; Hey team, as I&apos;m sure you&apos;ve noticed, our bug rate has been creeping up
    over the past month, and we&apos;ve had to roll back a number of our changes in
    production to prevent serious impact to our users. That&apos;s why starting
    Monday we&apos;re going to require that all changes have &gt; 50% code coverage
    before merging.  &lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We recognize that code coverage isn&apos;t a perfect metric for making sure
    that our changes are high-quality, but we chose this approach because it&apos;s
    quick for us to instrument, and it will allow us to quickly understand the
    impact of more rigorous testing standards on our development process. This
    will make it harder to get changes into production, but we have seen that
    most of our production incidents could&apos;ve easily been caught by testing, so
    we believe that by explicitly encoding a minimum testing bar, it can be a
    good first step to prevent a large class of errors.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;Let me
know if you have any questions.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is way better. It still makes it clear that a decision has been made, it
explicitly shows people that you&apos;ve considered the trade-offs, and you&apos;ve still
chosen this path. At the same time, it still may leave people worried that
you’re going to encode a burdensome policy forever.  We can resolve that by
framing it as an experiment.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hey team, as I&apos;m sure you&apos;ve noticed, our bug rate has been creeping up
    over the past month, and we&apos;ve had to roll back a number of our changes in
    production to prevent serious impact to our users. That&apos;s why starting
    Monday we&apos;re going to start a trial where we require all changes to have &gt;
    50% code coverage before merging.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;We recognize that code
    coverage isn&apos;t a perfect metric for making sure that our changes are
    high-quality, but we chose this approach because it&apos;s fairly quick for us to
    instrument, and it will allow us to quickly understand the impact of more
    rigorous testing standards on our development process. This will make it
    harder to get changes into production, but we have seen that most of our
    production incidents could&apos;ve easily been caught by testing, so we believe
that encoding a minimum testing bar can be a good first step to prevent a large
class of errors.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;As with all things, we&apos;re treating this as an
experiment. We&apos;ll let this policy run for 4 weeks, and then check the number of
bugs in production and talk to some developers to see how it&apos;s impacting your
workflow.  We’ll then decide on next steps.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;If you have any
questions, please let me know.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This final version does everything that the first two do: it clearly
communicates the trade-offs and makes it clear that a decision is being made. It
also frames the change as an experiment, which makes it feel much more
reversible and prevents some amount of re-litigating the issue from people who
disagree.&lt;/p&gt;

&lt;p&gt;This approach isn&apos;t always perfect. Sometimes you just need to make a
decision and commit to it for the long term. However, many times you can frame
your ambiguous decisions as experiments and communicate about them accordingly.
This will lead to happier teams, and hopefully less heart-burn as things
change.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Running Design Sprints for Engineering Teams</title>
   <link href="http://maltzj.github.io/posts/design-sprints-for-engineering"/>
   <updated>2020-04-10T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/design-sprints-for-engineering</id>
   <content type="html">&lt;p&gt;Sometimes engineering teams find themselves in a situation where they&apos;re
tackling a cross-functional problem with no clear path forward. In these cases
it can be challenging for individual teams to break out of their silos and see
the global problems, resulting in local optimization while the larger problem
remains unsolved.  Fortunately, teams can follow the structured process of a &lt;a
href=&quot;https://gv.com/sprint&quot;&gt;design sprint&lt;/a&gt; to cut through these problems and
quickly forge a path forward.&lt;/p&gt; 

&lt;h2&gt;What&apos;s a Design Sprint?&lt;/h2&gt;

&lt;p&gt;Design sprints are 5 day exercises which product teams can use to tackle an
ambiguous problem.  Sprints follow a structured process of rapidly gathering
context, ideating on approaches, picking a direction, and putting a prototype in
front of users.  This allows teams to turn weeks of debate into lessons from
users.&lt;/p&gt;

&lt;p&gt;Engineering teams generally don&apos;t need this whole process, but they can steal
the first two steps: rapid context gathering and ideating on approaches, to
quickly find a path forward for cross-functional problems.  All that&apos;s required
is you follow a structured approach to problem solving.&lt;/p&gt;

&lt;h2&gt;Day 0: Have a Facilitator Do Some Legwork&lt;/h2&gt;

&lt;p&gt;Before you try to run a sprint, you&apos;ll need a facilitator.  The facilitator
will act as a guide through the process and ensure that the process moves
towards a workable conclusion.&lt;/p&gt;

&lt;p&gt;A good facilitator will have enough context on the problem to guide the
discussion, but they &lt;em&gt;should not&lt;/em&gt; be someone who needs to actively
participate in the sprint. Facillitating for 6 hours a day is a full-time job,
and trying to both facillitate and participate is a recipe for
doing neither thing well.  This makes it a good chance for someone to &lt;a
                                                                             href=&quot;https://lethain.com/getting-in-the-room/&quot;&gt;get
                                                                             into
                                                                            the 
                                                                         room&lt;/a&gt;
with decision makers by providing a much-needed skill.&lt;/p&gt;

&lt;p&gt;The facilitator has a few jobs leading up to the sprint:&lt;/p&gt; 
&lt;ul&gt; 
    &lt;li&gt;They need to a consistent room
            for ~8-10 people for 2 days straight. They&apos;ll also need to make sure
            it&apos;s &lt;a
                     href=&quot;https://www.fastcompany.com/3028471/google-ventures-your-design-team-needs-a-war-room-heres-how-to-set-one-up&quot;&gt;appropriately
                     setup.&lt;/a&gt;  Finding a conference room that fits this
                 profile isn&apos;t easy, so it&apos;s one of the first things the
                 facilitator should do.&lt;/li&gt;
    &lt;li&gt;They
        need to identify 4-6 people who will be actively participating.  These
        people should be
        experts in their area, have enough knowledge to understand the domains
        of other sprinters, and be in a position to push forward prioritization
        of any requisite work post-sprint.&lt;/li&gt; 
    &lt;li&gt;They need to set a schedule of lightning talks and create a consistent slide deck for people to
                 present from. A consistent slide deck may seem like overkill,
                 but it will make sure that the lightning talks on day 1 answer
                 the right questions.&lt;/li&gt; 
    &lt;li&gt;They need to 
                 purchase &lt;a href=&quot;https://www.thesprintbook.com/supplies&quot;&gt;all
                 necessary supplies&lt;/a&gt;&lt;/li&gt; 
    &lt;li&gt;They will need to write a sprint brief explaining the problem the team is solving.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The facilitator will also be responsible for sharing and enforcing the No
Distractions Policy.  This means they&apos;ll kindly, but firmly, tell people that
they need to leave their phones at the door and not check Slack/email while
they&apos;re in the sprint room.  They&apos;re welcome to leave at any time to attend to
something, but they just need to do it outside the room.&lt;/p&gt;

&lt;p&gt;This is a lot of logistical legwork, but it&apos;s important.  This will use ~2
engineering weeks of time, and it&apos;s their responsibility to make sure it is well
spent.  Once all of these pieces are in place, it&apos;s time to move to day 1.&lt;/p&gt;

&lt;h2&gt;Day 1: Lightning Talks To Build Context&lt;/h2&gt;

&lt;p&gt;The first day of the sprint is focused on breaking participants out of their
local context and giving them a global view of the problem.  This is accomplished
with a day of lightning talks covering the problem space.&lt;/p&gt;

&lt;p&gt;Lightning talks are ~15 minute talks which explain particular team interacts
with the sprint&apos;s problem. For example, if the problem is &quot;how
can we reduce number of bugs we ship&quot;, you may have a lightning talk from
an application team discussing how they test for bugs, and a release engineering
team talking about how code gets released to production.  The facilitator
should also include talks from relevant non-technical teams like support or
product management to ensure that sprinters have a well-rounded view of the
problem. All told, you&apos;ll probably have ~10-12 lightning talks.&lt;/p&gt;

&lt;p&gt;During each talk sprint participants should capture opportunities through
&lt;a href=&quot;https://www.designkit.org/methods/3&quot;&gt;how might we (HMW)&lt;/a&gt; statements
on post-it notes. Each of these statements will describe an aspirational
question the team may want to solve based on that lightning talk.  After each
talk, participants will put these up on a shared surface. 
This will serve as the basis for discussion on day 2.&lt;/p&gt;

&lt;p&gt;By the end of day 1 you should have a whiteboard filled with problem
statements and a team that is now appropriately level-set.  Day 2 will be about
digesting those and making them actionable.&lt;/p&gt;

&lt;h2&gt;Day 2: Digest to problem statements&lt;/h2&gt;

&lt;p&gt;Day 1 was all about collecting a variety of problem statements; day 2 is
about synthesizing the global problems.  The team accomplishes this by grouping,
ranking, and driving towards &lt;a href=&quot;https://tools.ietf.org/html/rfc7282&quot;&gt;rough
consensus&lt;/a&gt; on problem statements.&lt;/p&gt;

&lt;p&gt;The first step in day 2 is to group the HMW statements from day 1 into
themes.  This doesn&apos;t need to follow rigid guidelines, but you&apos;ll want to
physically co-locate similar problems together.  Grouping will likely reveal a few
large clusters and a number of smaller satellites.  The facilitator then should give
everyone voting stickers and have them vote on the HMWs they feel are
most impactful, allowing duplicate votes if they feel strongly about a topic.
This whole process will take ~1 hour and it will reveal a heat map of ideas the
team feels are the most valuable.&lt;/p&gt;  

&lt;p&gt;The facilitator should take this map and find 3 distinct
areas for participants to dig into.  These problems should be the ones that
got the most votes and cut across engineering teams. This will leave out
impactful problems which are the domain of a single team. That&apos;s okay; if a team
already owns a particular problem, their internal processes can likely solve
that problem.&lt;/p&gt;

&lt;p&gt;Once the facilitator has identified areas, they should spend ~30 minutes
on each problem getting the participants to distill it down into a problem statement which
everyone can roughly agree on.  For example, if you saw statements like &quot;how
might we allow developers to test on real data?&quot; and &quot;how might we prevent bugs
which only show up on production infrastructure?&quot; you may work with the team to
distill that down to &quot;how might we allow developers to safely test their code in
a prod-like environment?&quot;  This problem statement succinctly captures a global
problem which otherwise may have fallen between teams.&lt;/p&gt;

&lt;p&gt;Getting perfect consensus will likely be impossible, but if you can get
something that people can accept for each problem area, that&apos;s a big win. Even
if you can&apos;t, understanding what&apos;s blocking a crisp statement is a big win&lt;/p&gt;

&lt;p&gt;Achieving this rough consensus will take the better part of a day, and will
likely leave everyone&apos;s brain pretty fried.  You&apos;ll want to spend the last bit
of day 2 wrapping up finding any next steps to start making progress on these
problems.&lt;/p&gt;

&lt;h2&gt;Day 3 -&gt; Onward: Driving Forward Results&lt;/h2&gt;

&lt;p&gt;The two days of sprinting are intense, but they&apos;re also only the beginning.
They&apos;ve produced a set of problem statements, but now they need to get solved.
Solutioneering is it&apos;s own can of worms, but there are a few things you can do
to set yourself up for success.&lt;/p&gt;

&lt;p&gt;First is the facilitator should broadly circulate notes + takeaways to a
wide group of relevant stakeholders.  This serves two purposes:&lt;/p&gt;

&lt;ul&gt; &lt;li&gt;It starts to socialize these problems, so that the wider team can start
        to form a more global problem understanding.&lt;/li&gt; &lt;li&gt;It helps make sure
        that you didn&apos;t make any big errors. You don&apos;t need total agreement on
        the problem statements, but you want to make sure you
        aren&apos;t making egregious errors.&lt;/li&gt; &lt;/ul&gt;

&lt;p&gt;You should also appoint a &lt;a
    href=&quot;https://about.gitlab.com/handbook/people-group/directly-responsible-individuals/&quot;&gt;directly
    responsible individual&lt;/a&gt; to drive forward solutions.  This person will be
    responsible for making the &lt;a
                                   href=&quot;https://www.youtube.com/watch?v=-JV5cyxS31Q&quot;&gt;impossible
                                   decisions&lt;/a&gt; involved in turning problem
                               statements into concrete proposals for solving
                               any problems.  They will work with teams to build define &lt;a href=&quot;/posts/roadmaps-vs-projects&quot;&gt;roadmaps and projects&lt;/a&gt; as required,
and then ultimately &lt;a href=&quot;/posts/getting-decisions-made&quot;&gt;
    getting those ideas prioritized&lt;/a&gt; to deliver solution.

&lt;h2&gt;Where is this not the right idea?&lt;/h2&gt;

&lt;p&gt;Running this type of sprint is a great way to get a bunch of shared
context and kickstart problem solving, but it&apos;s also time-consuming, so you
don&apos;t want to use it in every case. In particular, you probably don&apos;t want to use it if:&lt;/p&gt;

&lt;ul&gt; &lt;li&gt;You already have a reasonable idea of how to solve a problem, but you
        need to explore its edges.  In that case you may be better served by
        building a prototype or running a hackathon.&lt;/li&gt; &lt;li&gt;A number of people
        understand the problem, but it&apos;s still not moving forward.  A lack of
        collaboration may not be your biggest problem here, you may have
        underlying organizational issues that need fixing.&lt;/li&gt; &lt;li&gt;You aren&apos;t
        confident that you can get a DRI responsible for driving solutions. If
        you don&apos;t have the ability to execute, all of the brainstorming in the
world won&apos;t help you.&lt;/li&gt; &lt;/ul&gt;

&lt;p&gt;However, if your problem does fit the mold of &quot;we need to get people talking
and brainstorming&quot;, running this process can be a great way to cut through the
challenges of cross-team collaboration.  It won&apos;t immediately produce a
solution, but it will quickly give you enough to get started, and that be half
the battle.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Raising Problems Without Raising Blood Pressure</title>
   <link href="http://maltzj.github.io/posts/managing-anxiety-in-comms"/>
   <updated>2020-04-08T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/managing-anxiety-in-comms</id>
   <content type="html">&lt;p&gt;As you move from owning individual problems to owning projects, you&apos;ll often
find yourself in a position where you&apos;re surfacing risks to your manager or
other senior folks. Doing this well can be an art; on one hand you want to stay
&lt;a
                     href=&quot;https://lethain.com/staying-aligned-with-authority/&quot;&gt;stay
                     aligned with authority&lt;/a&gt; 
and make sure that leadership is aware of the problems.
At the same time, constantly surfacing risks without helping mitigate them can
erode confidence in your ability to deliver. Striking this balance can be hard,
but can be repeatedly done with the right communication strategy.&lt;/p&gt;


&lt;h2&gt;Where Do Anxiety and Confidence Come From?&lt;/h2&gt;

&lt;p&gt;When considering how to do this well, it’s worthwhile to think about building
confidence in your ability to deliver. I like to think about this with the two
equations:&lt;/p&gt;

&lt;pre&gt;perceived_risk = perceived_impact * perceived_likelihood_of_occurrence&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;perceived_confidence = sum(perceived_ability_to_impact / perceived_risk)&lt;/pre&gt;

&lt;p&gt;These aren&apos;t scientific, but looking at them gives an idea of the levers we
can use to increase peoples&apos; confidence in our ability to solve a problem: We can&lt;/p&gt;
&lt;ol&gt; 
    &lt;li&gt;Lower its perceived magnitude&lt;/li&gt; 
    &lt;li&gt;Lower its perceived likelihood of materialization&lt;/li&gt; 
    &lt;li&gt;Increase others&apos; perceived ability to impact it&lt;/li&gt; 
&lt;/ol&gt;

&lt;p&gt;We&apos;ll assume that #1 is outside of our control. There may be reasons to
inflate/deflate the perceived magnitude of a problem, but those are beyond the
scope of this post. Fortunately, we can manage #2 and #3 by how we talk about
risks.&lt;/p&gt;

&lt;h2&gt;How to influence confidence perception&lt;/h2&gt;

&lt;p&gt;The simplest way to affect these two factors is to follow a simple rule:
every description of a problem contains a description of its probability and
either actions being taken or a request for support. This is really easy to do
when you&apos;ve got the problem under control. I like to follow the below template
to make sure I get it right.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;There&apos;s a risk that ${PROBLEM} is going to bite us on ${TIME-HORIZON} at ${PROBABILITY}, we&apos;re mitigating this by doing ${ACTION-1} and ${ACTION-2}. How does that sound to you?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This template is nice because it describes the problem without making us seem
helpless.  It gives the other person a clear anchor so that they’re aware how
much they should keep an eye on it.  This phrasing also shows that we&apos;re aware
of the risks, are actively taking steps to prevent them from materializing, and
that there’s an obvious path to influence that risk through guiding us.&lt;/p&gt;

&lt;p&gt;Sometimes you don&apos;t know about the solution up front, and you need to
escalate for support. You can still do this in a confidence-building way by
saying:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hey {X} I have ${PROBLEM} and I&apos;m not sure how to solve it.  Can
    you help me brainstorm solutions?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This clearly shows that you&apos;ve &lt;a
                                       href=&quot;https://hbr.org/1999/11/management-time-whos-got-the-monkey&quot;&gt;got
                                       the monkey&lt;/a&gt; on this problem, but you need
help figuring out how to deal with it. By including a clear ask for help, you&apos;ve shown how the
other person can impact the problem, which can help control their concerns.&lt;/p&gt;

&lt;h2&gt;An Example&lt;/h2&gt;

&lt;p&gt;All of that is great in theory, but how does it work in practice?  To
consider that let&apos;s take a simple example: you&apos;ve been asked &lt;a href=&quot;/posts/book-report-software-estimation&quot;&gt;to prepare an
estimate&lt;/a&gt; that you are targeting to deliver in 4 months.
After running the numbers, you find that your estimate range runs 3 - 6 months.
This means there&apos;s a risk the project will slip its 4 month target. Your first
intuition may be to present this as:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We believe the project will take 3-6 months, so we may miss our 4 month
    target&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is an okay place to start. It clearly raises the risk of missing the
delivery date, but someone who reads this will have no idea how much they should
worry about this.  That doesn’t inspire a lot of confidence in our ability to
deliver.  We can make this better by adding probabilities.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We believe that the project will take 3-6 months.  We&apos;re 30%
    confident we can deliver it in 4 months&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is getting better. We’ve now given people a percentage that this risk
will materialize.  If 30% probability of success is acceptable, people can move
on with their day.  If it’s unacceptable, they can dig in and start to help.
This presentation still puts a lot of onus on the listener to deal with the
situation though. We can take clearer ownership of the problem by saying:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We believe that the project will take 3 - 6 months.  We&apos;re currently 30%
confident that we can deliver it in 4 months. Can we brainstorm areas ways we
can increase this confidence?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ending with a question makes a huge difference! We&apos;ve turned a problem
without an owner into one with a clearly defined owner (us) and a clear path for
others to influence it via a brainstorming session. This may be the best we can
do if we don&apos;t control the project plan. If we control the project planning, we
can show even stronger ownership.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We believe that the project will take 3 - 6 months.  We&apos;re currently 30%
confident that we can deliver in 4 months.  Much of the risk is in
implementing the new UI components, so we&apos;ll mitigate that with a spike next
week.  In the meantime, can we brainstorm areas where we can possibly cut scope
or otherwise increase confidence?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This approach gives us everything that the previous answer does, but it also
shows that we&apos;re aware of the risks and are decreasing their likelihood of
materialization. This builds confidence in our ability to manage the project to
a satisfactory conclusion.&lt;/p&gt;

&lt;p&gt;This example makes it seem easy, but the truth is managing other people’s
confidence levels is hard. In the swirling world of project leadership you&apos;ve
got many things to juggle, and sometimes perfect communication gets dropped in
the process. Fortunately, you can consistently create confidence and avoid alarm
by making sure that you describe risks with a probability and either an action
or a request for support.&lt;/p&gt;

&lt;em&gt;Big thanks to Bill Hewitt, who made this post infinitely better with his
    feedback.&lt;/em&gt;
</content>
 </entry>
 
 <entry>
   <title>Book Report on Software Estimation - Demystifying the Dark Arts</title>
   <link href="http://maltzj.github.io/posts/book-report-software-estimation"/>
   <updated>2020-04-06T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/book-report-software-estimation</id>
   <content type="html">&lt;p&gt;Estimation is something that I&apos;ve done for a long time, but I&apos;ve never really
felt like I&apos;ve done it &lt;em&gt;well&lt;/em&gt;.  I started rectifying that by reading
Steve McConnell&apos;s &lt;a
    href=&quot;https://www.amazon.com/Software-Estimation-Demystifying-Developer-Practices/dp/0735605351&quot;&gt;Software
    Estimation: Demystifying the Black Art&lt;/a&gt;.  The book is chock full of great
ideas, and I&apos;ve summarized them here for anyone looking to quickly improve their
estimation skills.&lt;/p&gt;

&lt;h2&gt;Estimates vs. Targets vs. Commitments&lt;/h2&gt;

&lt;p&gt;The book starts off by talking about three things that often get confused:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;b&gt;Commitments&lt;/b&gt; are dates that you have told external
        stakeholders that something will be ready.  This is commonly a public
        launch.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;Targets&lt;/b&gt; are goals that you&apos;re trying to hit.  They could
        be a feature that you&apos;re trying to launch by the end of the month, 
        or it could be a metric that you&apos;re trying to move by some amount by 
        the end of the quarter.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;Estimates&lt;/b&gt; are analytical statements about how
        long a team thinks it will take to deliver a set of functionality.
        These should be decoupled from commitments or targets.
    &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We often confuse these things, and it results in missed opportunities for
collaboration. Consider the case where a PM wants to give a live demo of a new
feature at a conference next month.  Engineering estimates the feature, and
finds that it will take two months to deliver.&lt;/p&gt;  

&lt;p&gt;At this point, we should realize that we have two things: a &lt;em&gt;target&lt;/em&gt;
to deliver by the conference, and an &lt;em&gt;estimate&lt;/em&gt; about how long the scoped
work will take.  The estimate suggests that the target will be difficult, so the
team can take a few actions.  The team can set a similar target with guardrails,
they set a less ambitious target, or they could even keep the same
target, but accept the risk that they may fail and have no demo.  The one thing
they shouldn&apos;t do is quibble over the underlying estimate unless there is a
problem with the analysis.&lt;/p&gt;

&lt;h2&gt;Count, Compute, Judge&lt;/h2&gt;

&lt;p&gt;Once that difference is established, the book moves on to discuss how to
produce accurate estimates.  McConnell a three step process called count,
compute, judge to do this.&lt;/p&gt;

&lt;p&gt;The first step in count, compute, judge is to get an unbiased estimate of the
size of your software by counting things related to its size. The things that
you count will be dependent on your application, for UI applications it may be
new screens, but backend applications may count new ETL jobs and new API
endpoints, but it&apos;s important that you count &lt;em&gt;something&lt;/em&gt; to get an
unbiased read on the size of your project.&lt;/p&gt;

&lt;p&gt;Once you&apos;ve counted, the next step is to compute an estimate. For example,
let&apos;s assume you&apos;re estimating a new feature.  First you look at the mocks and
you see that it will require 6 new screens, 3 new API endpoints, and updates to
2 API endpoints.  You then look at historical data and see that it takes your
team an average of 3 weeks to build a new UI screen, 2 weeks to create a new API
endpoint, and 1 week to update an existing endpoint. This would mean that you
estimate &lt;pre&gt; 6 * 3 + 3 * 2 + 2 * 1 = 25 total staff weeks.&lt;/pre&gt;  

&lt;p&gt;This estimate is delightfully free of bias, but it can&apos;t account for the
fact that each feature is unique. That&apos;s where the last step, judge, comes into play.
You use judgement to tweak your initial counting and computations.  In our case,
you may notice the that API endpoints are in hairy parts of your code, so
they will take longer than average. This may mean
that we bump up our estimate of staff-weeks per API update to 2.5, giving us a new
estimate of &lt;pre&gt; 6 * 3 + 3 * 2 + 2 * 2 = 27 total staff weeks.  &lt;/pre&gt; This
estimate is still grounded in data, but now it&apos;s informed by judgement.&lt;/p&gt;

&lt;h2&gt;Estimating in Ranges&lt;/h2&gt;

&lt;p&gt;It can be easy to see this single value as The Estimate, but that would be flawed.
Sometimes stuff goes way faster than we expect, more often it takes longer.
Your estimates need to account for this variability by incorporating ranges.&lt;/p&gt;

&lt;p&gt;The simplest way to do this is create a best case, a worst case, and
expected case estimate complete with the underlying assumptions that created the
estimate. Combining estimates and assumptions will give more accurate estimate
and more tools to ensure a successful project.&lt;/p&gt; 

&lt;p&gt;Compare these two estimates&lt;/p&gt; 
&lt;p&gt;&lt;em&gt;&quot;The project will take 27 staff weeks&quot;&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;vs.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;The
project will take between 15 and 48 staff weeks, with an expected effort of 27
staff weeks.  If we can find a lot of code re-use and the project gets
fully-staffed we can save 2 and 3 weeks respectively. If the design mocks turn out
to be really novel it could cost us up to 6 additional staff weeks.&quot;&lt;/em&gt;&lt;/p&gt; 
&lt;p&gt;The second estimate
is more useful: it allows us to make informed engineering staffing decisions and
shows us where we should can best focus our effort to derisk the project.&lt;/p&gt;

&lt;p&gt;It&apos;s also worth noting that outcomes on projects aren&apos;t normally distributed,
so they don&apos;t need to be symmetric around the expected value.  In our example
above, our best case was 12 staff-weeks lower than the expected case, but the
worst case was 21 staff-weeks higher.  That&apos;s okay.  What matters is that you
used the correct inputs into the estimation process.&lt;/p&gt;

&lt;h2&gt;The Cone of Uncertainty&lt;/h2&gt;

&lt;p&gt;Estimating in ranges is tightly tied to another key idea in the book: The
Cone of Uncertainty.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&quot;/images/Cone_of_Uncertainty.jpg&quot; alt=&quot;The cone of uncertainty
represents the amount of uncertainty in various stages of a project.&quot;/&gt;
&lt;/figure&gt;

&lt;p&gt;The cone is a visual representation of the fact that at the beginning of a
project you have very little information, so you&apos;re very uncertain about how
long it will take.  As the project progresses you gain
information and increased certainty until it is finally delivered. This has a
couple of implications for estimates.&lt;/p&gt; 

&lt;p&gt;First, it means that at the beginning of a project you can probably only
count very coarse grained things, so your best + worst cases may be quite 
different.  These estimates will progressively narrow as you move down the cone.&lt;/p&gt;

&lt;p&gt;This increasing clarity also means you&apos;ll want to use different estimation
strategies depending on where you are in the project. In the beginning of the
project you can really only count proxies for project size, so a quick and rough
estimation technique like &lt;a
                              href=&quot;https://explainagile.com/blog/t-shirt-size-estimation/&quot;&gt;t-shirt
                              sizing&lt;/a&gt; will do.  As you get
further on you can start to estimate individual tasks with more accurate
estimates.&lt;/p&gt;

&lt;h2&gt;Communicating Accuracy in Estimates&lt;/h2&gt;

&lt;p&gt;The last point that comes up frequently is how to communicate the accuracy of
estimates.  Frequently your process of counting + computating will give numbers
that seem very accurate but your estimation method couldn&apos;t have given you that
degree of accuracy. For example, let&apos;s say that you&apos;re early in a project, you
count the find that you have 23 components left to build and expect each one to
take 7.25 staff days.  That gives you 166.75 staff days of work.&lt;/p&gt;

&lt;p&gt;That number seems very accurate, but much of the accuracy is a mirage. There is no way
you can tell down to the quarter-of-a-day how long a 7+ month long project will
take. If you present this estimate in its current form, they&apos;ll say
&quot;gee, it sounds like Maltz has really done his homework.  He&apos;s working with 2
other engineers, so I should expect that in exactly 8 weeks.&quot;&lt;/p&gt;

&lt;p&gt;This is not good.  Slipping by 4-5 days on that estimate will seem like a
miss, even though that&apos;s totally reasonable when you&apos;re at this stage.  There are
two easy techniques to avoid this.&lt;/p&gt; &lt;p&gt; &lt;ul&gt; &lt;li&gt; Remove significant
                digits.  166.75 Staff days reads different than 167 staff days,
                which is different still from 175 or 200 staff days.  These differences
                in reported accuracy will help others calibrate their
                expectations.  &lt;/li&gt; &lt;li&gt;Change
                the units you estimate in.  If you estimate down to the day,
                people will assume you&apos;re controlling the project down to the
                day.  If your units are weeks, or months, people will assume
                less tight control.  In
        our example above, changing 166.75 staff days may be better estimated as
        33 staff-weeks or 7 staff months.  &lt;/li&gt; &lt;/ul&gt; &lt;/p&gt;

&lt;p&gt;These ideas are the most common threads that run through Software Estimation:
Demystifying the Dark Art, but there are many more.  I found it to be
brimming with strategies and tactics that immediately helped me become a
better estimator.  If you&apos;re trying to level up your own estimation skills I&apos;d
highly recommend picking it up.&lt;/p&gt;

&lt;em&gt;A big thanks to Michael Stephens for reading an early draft of this
    post.&lt;/em&gt;
</content>
 </entry>
 
 <entry>
   <title>A Default Approach to Quarterly Planning</title>
   <link href="http://maltzj.github.io/posts/default-approach-to-planning"/>
   <updated>2020-04-05T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/default-approach-to-planning</id>
   <content type="html">&lt;p&gt;Teams often find themselves in a position where they need to figure out how
much work they can commit to, most commonly in quarterly planning.  If you&apos;ve
never done this before then wading through a world of possibilities to get to a
commitment can feel impossible.  Fortunately, I&apos;ve found that a default approach
can help you establish a plan reasonably quickly and with minimal overhead.&lt;/p&gt;

&lt;p&gt;Before going further, I&apos;ve created this &lt;a
    href=&quot;https://docs.google.com/spreadsheets/d/1A_kiYX1x4mUVD4kiCEuw22xe2YcyhVFJ4M2hjnUdmo8/edit#gid=0&quot;&gt;this
    spreadsheet.&lt;/a&gt; as an example of this process for a theoretical food
delivery company.  We&apos;ll be revisiting the spreadsheet a couple of times, so
take a quick skim of the first row of each sheet.&lt;/p&gt;

&lt;p&gt;Skimming successful? Great. Let&apos;s move into the details.&lt;/p&gt;

&lt;h2&gt;Step 1: Figure out your goals&lt;/h2&gt;

&lt;p&gt;Before you go figuring out what to build this quarter, you need to figure out what you&apos;re trying to
achieve.  In Silicon Valley, this frequently looks like &lt;a
                                                            href=&quot;https://upraise.io/blog/writing-effective-okrs/&quot;&gt;defining
                                                            OKRs&lt;/a&gt;, but any
goal setting framework will do.  What&apos;s important is that you have some common
yardstick to measure each project&apos;s impact and prevent the loudest opinion from
dictating what the team will work on.&lt;/p&gt;

&lt;p&gt;After you&apos;ve defined your OKRs, write them down so they can be referenced
later in planning.  This should give you something like &lt;a
    href=&quot;https://docs.google.com/spreadsheets/d/1A_kiYX1x4mUVD4kiCEuw22xe2YcyhVFJ4M2hjnUdmo8/edit#gid=0&quot;&gt;the
    first sheet of our example.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Step 2: Make a list of projects and their impact&lt;/h2&gt;

&lt;p&gt;Once you have your goals, the next step is to write down possible
projects and their impact. In the interest of keeping this list manageable, a
&quot;project&quot; is something that will take more than 1 staff-week of work. Many of these
will be user-facing features, but you also want to collect engineering-focused
projects here.&lt;/p&gt;

&lt;p&gt;Each of these projects should include a short description of the
requirements and a description of its impact. As much as possible,
engineering and product-focused projects should describe impact should be in the
language of the goals defined in step 1.  This will help make sure that all
projects are prioritized on equal terms.&lt;/p&gt;

&lt;h2&gt;Step 3: Put estimates on all projects&lt;/h2&gt;

&lt;p&gt;Once you have a list of projects and their impact, the next step is to put
estimates on them.  There are a variety of ways you can do this but, I&apos;ve found
    that having the people close to the work give &lt;a
                                                      href=&quot;https://explainagile.com/blog/t-shirt-size-estimation/&quot;&gt;t-shirt
                                                      sized estimates&lt;/a&gt; is a
                                                  good approach here.  T-shirt
                                                  sizes are nice for this
                                                  because they give high and
                                                  low estimates, which
                                                  appropriately convey
                                                  uncertainty, and they can be
                                                  assigned quickly.&lt;/p&gt;

&lt;p&gt;At this stage, you&apos;ll also want to allow for a little bit of push-and-pull on
requirements.  If there are ways to deliver a subset of the project at a
fraction of the cost, you&apos;ll want to surface that now so that you can
incorporate that information in later stages of planning.  However, you don&apos;t want to
negotiate over specific requirements at this stage, as that can quickly become a
time-sink.&lt;/p&gt;

&lt;p&gt;Once you&apos;ve done this, you should have a spreadsheet that looks something
like &lt;a
         href=&quot;https://docs.google.com/spreadsheets/d/1A_kiYX1x4mUVD4kiCEuw22xe2YcyhVFJ4M2hjnUdmo8/edit#gid=1613272465&quot;&gt;the
         second sheet in our example.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Step 4: Figure out your capacity&lt;/h2&gt;

&lt;p&gt;Now you&apos;ve got projects, impact, and estimates.  The last input we need
for a plan is an understanding how much the team can accomplish.
Having historical velocity to calibrate against is best, but in the absence of
that you can get by with taking the number of staff-weeks available on your team
and applying a consistent haircut for things like PTO, on-call, and
high-priority small tasks.&lt;/p&gt;

&lt;p&gt;If you want to more accurately assess team capacity, Steve McConnell&apos;s &lt;a
    href=&quot;https://www.amazon.com/Software-Estimation-Demystifying-Developer-Practices/dp/0735605351&quot;&gt;Software
    Estimation: Demystifying the Black Art&lt;/a&gt; has a number of good techniques.&lt;/p&gt;

&lt;h2&gt;Step 5: Establish your overall plan&lt;/h2&gt;

&lt;p&gt;Now we have all the inputs into our plan, the last step is to actually make
it.  The simplest way to do this is to start filling up your team&apos;s queue with
the &quot;best&quot; projects (probably defined as highest impact-effort ratio) until the
sum of their high estimates is equal to team capacity.  These are your &quot;green&quot;
projects: the ones you&apos;ll plan around for the quarter.&lt;/p&gt;

&lt;p&gt;Then, keep stack-ranking the remaining projects until the sum of their
low-estimates equals the team&apos;s capacity.  These are your &quot;yellow&quot; projects; the
ones you&apos;ll work on if things go well, but will get cut depending on how the
quarter goes.&lt;/p&gt;

&lt;p&gt;Finally, you&apos;ll have a bunch of projects that don&apos;t make the cut.  These are
&quot;red&quot; projects, and they just won&apos;t happen this quarter unless something
changes.&lt;/p&gt;

&lt;p&gt;After this step, you should have something that looks like &lt;a
                                                                  href=&quot;https://docs.google.com/spreadsheets/d/1A_kiYX1x4mUVD4kiCEuw22xe2YcyhVFJ4M2hjnUdmo8/edit#gid=7959846&quot;&gt;the
                                                                  third sheet in
                                                              our example.&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;Step 6: Sanity check with a Gannt Chart&lt;/h2&gt;

&lt;p&gt;Once we have a plan, I like to check the results by making a quick &lt;a
    href=&quot;https://en.wikipedia.org/wiki/Gantt_chart&quot;&gt;gannt chart.&lt;/a&gt; The
purpose of this is sanity check your assumptions and look for anything you&apos;ll
need to plan around, &lt;em&gt;not&lt;/em&gt; to make a strict
schedule you&apos;ll follow for the quarter.  It will probably accurately reflect
your team&apos;s work over the next ~4-6 weeks, but will become more speculative
after that.&lt;/p&gt;

&lt;p&gt;After adjusting your gannt chart for things like deadlines and staffing
    requirements, you&apos;ll end up with something like &lt;a
    href=&quot;https://docs.google.com/spreadsheets/d/1A_kiYX1x4mUVD4kiCEuw22xe2YcyhVFJ4M2hjnUdmo8/edit#gid=769496698&quot;&gt;the
    final sheet in our example spreadsheet.&lt;/a&gt; Congratulations, you&apos;ve got a quarterly plan!&lt;/p&gt;

&lt;h2&gt;Step 7: Share a narrative of your plan&lt;/h2&gt;

&lt;p&gt;Now that you&apos;ve got a plan, chances are other people in your company will
care about it.  You could share the spreadsheet you used to make the plan, but
that&apos;s not easily digestible.  Instead, you&apos;ll probably want to
turn your plan into a narrative document.  There are lots of ways
to do this, but I like to follow Guarav Oberoi&apos;s &lt;a
                                                     href=&quot;https://goberoi.com/on-writing-product-roadmaps-a4d72f96326c&quot;&gt;Medium
                                                     post on building product
                                                 roadmaps&lt;/a&gt; as a default
                                             approach.  His process for getting
                                             to a roadmap is slightly different,
                                             but the end product can be
                                             identical.&lt;/p&gt;

&lt;p&gt;Sharing this out in a narrative format can also help other teams understand
what you&apos;re accomplishing and allow them to easily give feedback if you&apos;re
missing any assumptions.&lt;/p&gt;

&lt;h2&gt;What are the strengths and weaknesses of this approach?&lt;/h2&gt;

&lt;p&gt;Overall I&apos;ve found this approach to be effective for understanding what a
team of ~4-8 people can build over a ~3 month time horizon, which makes it
perfect for quarterly planning for a feature team where you don&apos;t need
crystal-clear accuracy over for the quarter.&lt;/p&gt;

&lt;p&gt;At the same time, this approach isn&apos;t a panacea.  In particular, it has a few
limitations: 
    &lt;ul&gt; 
        &lt;li&gt; It hand-waves over external dependencies.  This means that if
            you&apos;re in an environment where you have a lot of dependencies, you
            may want a broader process similar to this &lt;a
            href=&quot;https://firstround.com/review/the-secret-to-a-great-planning-process-lessons-from-airbnb-and-eventbrite/&quot;&gt;&quot;W-shaped&quot;&lt;/a&gt;
            approach.  If nothing else, it makes sense to follow Guarav&apos;s advice
            of making sure to call out dependencies as a risk in your
            narrative.&lt;/li&gt; 
        &lt;li&gt;It doesn&apos;t give super accurate estimates or
            clear project plans, especially if you estimate with t-shirt sizes.
            I&apos;ve found this to be mostly fine since our main goal
            with this process is to establish &quot;what work can we plausibly do&quot;,
            not a perfect schedule.  Once we&apos;ve established the work we
            can take on, then we can start to manage individual projects
            and create a more accurate schedule.
        &lt;/li&gt; 
        &lt;li&gt;It starts to break down past ~3 months.  The lack of dependency
            tracking and rough estimation approaches means this is fine for ~1
            quarter, but not much further than that.  If
            you need planning past the quarter-level, consider other
            approaches.
        &lt;/li&gt; 
    &lt;/ul&gt; 
&lt;/p&gt;

&lt;p&gt;In spite of these limitations, I&apos;ve found that running this process is a
great way to cut through ambiguity and get a quarterly plan pretty quickly.
It&apos;s my default tool when I need to run a planning process, and would recommend
it to others who are just getting started with quarterly planning.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post was made way better thanks to feedback from &lt;a
                                                                 href=&quot;http://poros.github.io/&quot;&gt;Antonio
                                                                 Verardi&lt;/a&gt; and
Joe Orsini.&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Evolving Communication Structures With Exponential Scheduling</title>
   <link href="http://maltzj.github.io/posts/exponential-meeting-scheduling"/>
   <updated>2020-03-28T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/exponential-meeting-scheduling</id>
   <content type="html">&lt;p&gt;One of my challenges at Nuna has been setting up team-level communications structures in
the face of uncertainty.  Going from 0 to 1 means that our understanding of the
problem constantly evolves, and with that, our communications structures need to
evolve with it.  I&apos;ve managed to grapple with that change through an approach I
call exponential scheduling.&lt;/p&gt;

&lt;h2&gt;Exponential Scheduling&lt;/h2&gt;

&lt;p&gt;The basic idea of exponential scheduling is simple: whenever we see an
opportunity to refactor our communications structure we try a small change, and
then repeat that an exponential number of times until we&apos;ve reached a happy medium.&lt;/p&gt;

&lt;p&gt;In practice this means that when we see a communications gap we don&apos;t start by
putting a hour-long meeting permanently on people&apos;s calendar.  Instead, we
talk for a few minutes, and form a hypothesis about how to fill that gap.  
Sometimes this means starting a weekly meeting, but other times it has meant
sending out a semi-regular newsletter.  For the purposes of this article, I&apos;ll
assume it means setting up a weekly meeting.&lt;/p&gt;

&lt;p&gt;Once we have our hypothesis, we try it for 1-2 weeks, and we ask
ourselves &quot;was that useful&quot;?  If so, we extend it out to 4 weeks and revisit.
After that, we do it again, this time for 8 weeks.  Finally, after 8 weeks, we
make it a recurring part of our schedule.&lt;/p&gt;

&lt;p&gt;We can do the same thing in reverse.  If we notice a regular meeting has been thin on
content, we won&apos;t pull it off the calendar, we&apos;ll halve the frequency, make a
note to revisit in a month, and let that run for a couple iterations.  If it&apos;s
still thin on content, we&apos;ll re-evaluate and remove the meeting altogether.&lt;/p&gt;

&lt;h2&gt;Why I Like This&lt;/h2&gt;

&lt;p&gt;The biggest reason that I like this is it makes it easy to try out new
communication structures.  Adding recurring meetings is often met with &quot;ugh,
another meeting&quot;, and removing them can be met with FUD about the impact on team
cohesion. With exponential scheduling, we can mitigate both of those by defining
a small, reversible experiment with a clear re-evaluation path in case we&apos;re
wrong.  This helps us capture the upside of making the change, while mitigating
downside-risk if we&apos;re wrong.&lt;/p&gt;

&lt;p&gt;The other advantage with this approach is that it helps prevent calendar
overload.  In order for a meeting to stay on the calendar as a recurring event,
it needs to prove its value 3 times over the course of a quarter.  This helps
prevent calendar inertia from accidentally filling up peoples&apos; time.&lt;/p&gt;

&lt;h2&gt;When is this the wrong choice?&lt;/h2&gt;

&lt;p&gt;As with all tools, this one doesn&apos;t solve everything. In particular, this
approach  doesn&apos;t work so well if you are undergoing a re-org and the fundamental
structure of your team is changing.  In those cases, it&apos;s probably worth setting
up a default comms structure and then evolving.&lt;/p&gt;

&lt;p&gt;Another time when this approach struggles is if the experiment means trying
out a new structure or learning new skills.  In these cases, the first couple of
tries may feel a little bit chunky as you work out the kinks.  If you anticipate
that happening you can still use this approach, but make your initial experiment
longer and set expectations accordingly so that people don&apos;t give up after the
first iteration.&lt;/p&gt;

&lt;p&gt;I&apos;d also speculate that this is the wrong choice is if you&apos;re in a position
where there are multiple, interlocking communications problems and the
incentives are not obviously aligned around fixing them piecemeal.  In those
cases, I&apos;d speculate that the move is to &lt;a href=&quot;/posts/getting-decisions-made&quot;&gt;find a decision maker&lt;/a&gt; and work with them to fix the
underlying problem.  However, that feels like an extreme move, and one
that I&apos;ve never had to use.&lt;/p&gt; 

&lt;p&gt;Overall, I&apos;ve found that much like incrementally refactoring your code with
small changes, incrementally refactoring communications structures with small
experiments has been very useful.  It has allowed us to set up resilient
structures and has prevented us from accidentally locking in long, useless
meetings.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>How do I get my ideas prioritized?</title>
   <link href="http://maltzj.github.io/posts/getting-decisions-made"/>
   <updated>2019-11-27T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/getting-decisions-made</id>
   <content type="html">&lt;p&gt;A while ago I was struggling with the question of &quot;how do I get a project
prioritized.&quot;  I had an idea that everyone agreed was good, but it was
languishing and other work was getting prioritzed. I talked to a mentor and he
gave me a three-step process that I&apos;ve since found very useful.  The process
goes something like this&lt;/p&gt;

&lt;h2&gt;Step 1: Identify the decision maker&lt;/h2&gt;

&lt;p&gt;Who is the person who can grant you the authority to do the thing you want to
do?  Chances are this is a product manager, or someone above you in the
management chain.  If you can&apos;t get a clear answer here that&apos;s part of the
problem, and you should work with possible decision makers to get one (or a
group) appointed.  If you can&apos;t reach a consensus on a decision maker, escalate
and get someone to appoint a decison maker.&lt;/p&gt;

&lt;h2&gt;Step 2: Figure out what the decision maker cares about&lt;/h2&gt;

&lt;p&gt;You may think you have the most whizz-bang idea under the sun, but if your
decision maker doesn&apos;t see why it matters to them you won&apos;t get very far.  Spend
time to figure out what matters to your decision maker.  You can get a
first-pass idea of this by looking at what metrics they track (probably in the
form of OKRs), and then you can sit down to talk with voices for a more
qualitative understanding.&lt;/p&gt;

&lt;h2&gt;Step 3: Figure out what will not happen if your decision gets made&lt;/h2&gt;

&lt;p&gt;Time isn&apos;t infinite, so if a team starts to do your thing, they won&apos;t be
doing something else.  Figure out roughly how large your idea is, and what would
get cut if your team undertakes it.  This is a great time to brainstorm ways to
figure out to trim your idea down to its simplest form, or figure out how you
can align what you want to accomplish with an existing endeavor.  Both of these
minimize how much work needs to be cut, and will likely make your pitch
easier&lt;/p&gt;

&lt;p&gt;After you do this, evaluate whether or not your idea will help the decision
maker in the axes that they care about.  If not, you should probably reconsider
your idea, or try to reshape what matters to your decision maker (probably by
changing the larger group&apos;s metrics)&lt;/p&gt;

&lt;h2&gt;Step 4: Make your case in the language of your decision maker&lt;/h2&gt;

&lt;p&gt;Present your idea to your decision maker, along with what will be cut, in a
succinct format.  The format will depend on your context, but the core structure
    of your message, but it will probably look something like: &lt;em&gt;We are
        currently doing X.  If we start doing Y, then it will help us achieve
        goals 1 and 2 faster/better/more reliably; this will mean we will need
        to change Z, but we can safely do that by undertaking these mitigations.
        I propose we start doing this by taking a step move this forward. Should
        we take that step?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This probably won&apos;t get you an immediate &quot;yes&quot;, but you should leave this
presentation with a clear action item of how to move forward on your idea, even
if that answer is &quot;not now, let&apos;s evaluate after 2 months.&quot;&lt;/p&gt;

&lt;h2&gt;An Example: Building Container Infrastructure&lt;/h2&gt;

&lt;p&gt;A while ago I thought that we should start to invest in building our
container infrastructure for our web platform.  This would require us to get
staffing from our infrastructure team to build something that was reusable
across all of our systems.  I identified the decision makers as the team lead
for our infrastructure team and the manager for our web team.&lt;/p&gt; 

&lt;p&gt;Next, I figured out what each of them cared about.  Our web manager had an
OKR around launching our batch API and decreasing the time to create new
integrations, and the infrastructure team lead had an OKR around enabling
developers to fast feedback on infrastructure changes.&lt;/p&gt;

&lt;p&gt;I looked at what we were doing currently.  As part of our current
integration, we were spending some time doing manual infrastructure
configuration.  I knew that with Docker we could turn these into ephemeral
environments. That would be some upfront costs, but it would make future client
integrations faster.  It would also mean we could test our infrastructure
changes locally by building containers.  This aligned with both the web team&apos;s
KRs, and the  infra team&apos;s KRs.&lt;/p&gt;

&lt;p&gt;Now we had our first three things: we had identified decision makers (web manager
+ infra team lead), figured out what mattered to them, and figured
out the tradeoffs involved in building our idea (slower delivery of current
feature, and later delivery of some other features), but still felt that the
trade-offs were worth it given our KRs. There was a risk that our containers
work would take longer than anticipated, but we&apos;d built a prototype to mitigate
some of that, and we always had our quick and dirty original approach if we
needed it.  Lastly, we had to make the decision.&lt;/p&gt;

&lt;p&gt;To do this, I had a meeting with all the stakeholders and wrote a 2-pager
detailing the above, and asking for a clear decision: &quot;should we spend 1 month
of 2 engineers&apos; time to build this feature using containers?&quot;  There was a
little bit of back and forth, but eventually we decided &quot;yes, this is what we
should do&quot; and we built the thing.&lt;/p&gt;

&lt;p&gt;All of the above sounds easy, but it took around 6 weeks of discussions,
drafting, prototyping, and refining before we ultimately took a call.
Fortunately, by having a clear process, it never felt directionless.  This has
since been my go-to process for managing new ideas, and I&apos;d recommend it if
you&apos;re struggling to get your own ideas prioritized.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Is Conference Speaking Worthwhile?</title>
   <link href="http://maltzj.github.io/posts/is-speaking-useful"/>
   <updated>2019-05-11T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/is-speaking-useful</id>
   <content type="html">&lt;p&gt;Over the past few months, a few people have asked me about my experience
speaking and blogging, specifically through the lens of what type of
opportunities it has opened up for me.  My thoughts on this have been rattling
around for a while, so I wanted to share them broadly in case other people have
similar questions.&lt;/p&gt;

&lt;h2&gt;Some background&lt;/h2&gt;

&lt;p&gt;First, a bit of level-setting about exactly how much speaking/blogging I’ve
done over the past couple of years.  Since April 2017 I have:&lt;/p&gt;

&lt;ol&gt;
    &lt;li&gt;
        Given tech talks at eight different professional conferences. These
        talks were generally well received and were well-reviewed.  If you&apos;re
        curious about the topics, you can find all of them &lt;a
            href=&quot;https://speakerdeck.com/maltzj&quot;&gt;on my speakerdeck page&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
        I’ve also published ~10 blog posts on technical-ish topics.
    &lt;/li&gt;
    &lt;li&gt;
        That content has gotten featured on a couple of Twitter lists and one of my decks was “Featured” on Speakerdeck for a day.
    &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That works out to around 1 conference talk a quarter and one blog post a
quarter.  That roughly translates to &quot;more content than your average bear, but
certainly not a lot.&quot;&lt;/p&gt;

&lt;h2&gt;What has all this done for me?&lt;/h2&gt;
&lt;p&gt;First, let’s start by talking about the benefits.&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;
        &lt;b&gt;Strangers on the internet have said I’m cool&lt;/b&gt;: Every once and a while I’ll
        get a tweet from someone saying they read my blog post or saw one of my
        talks and they enjoyed it.  That’s awesome, and it makes me feel really good
        whenever it happens.
    &lt;/li&gt;
    &lt;li&gt;
        &lt;b&gt;I’ve gotten to go to lots of conferences&lt;/b&gt;: This seems obvious, but it’s
        actually really important.  My guess is most companies will fund you to
        go to one conference a year; I go to around four a year without paying for them.
        That means I get 4x the opportunities to immerse myself in content, grow as an
        engineer, and take stuff back to the my team.  That’s been huge for me, and has
        definitely contributed to my breadth of technical skills.
    &lt;/li&gt;
    &lt;li&gt;
        &lt;b&gt;My company has paid for me to fly lots of places&lt;/b&gt;: Work has covered every
        conference I’ve spoken at, even the international ones.  This means that if
        I want to, I can extend my time in a new city for a couple days and pretty
        much only pay for the hotel.  That’s pretty cool, and definitely something I
        appreciate.
    &lt;/li&gt;
    &lt;li&gt;
        &lt;b&gt;I’ve gotten to meet a lot of cool people&lt;/b&gt;: By speaking at conferences I’ve
        gotten to talk with a lot of people I would’ve never otherwise interacted
        with. Most of the time these conversations are 30 minute hallway chats and I
        never see the person again (that’s okay!) but occasionally we’ll tweet
        at each other.  Either way, conference speaking has brought me
        in touch with a lot of lovely, intelligent, and thoughtful people, and I’m
        grateful for all of them.  As a bonus, many of these people were willing
        to talk candidly to me about opportunities when I was job hunting, and
        their referrals fast-tracked me into the interview process.
    &lt;/li&gt;
    &lt;li&gt;
        &lt;b&gt;I&apos;ve been forced to formalize my thoughts&lt;/b&gt;: Oftentimes my proposals are about
        non-technical topics, so once they get accepted I need to do a bunch of hard
        work to turn them into ideas which are digestible by others.  This process
        of turning “weird amorphous brain soup” it into “coherent narrative” makes me
        better at that topic.  I could probably do that via other means (reflection,
        journaling, etc), but speaking is the one I use.
    &lt;/li&gt;
    &lt;li&gt;
        &lt;b&gt;I’ve gotten connected to some internet famous people&lt;/b&gt;: The “conference
        speaking circuit” (at least with in Android) is surprising small.  Once I’d been to 3 or 4 conferences, 
        I’d crossed paths with a lot of folks who were making cool Android stuff.  
        None of them offered me a job immediately (although some did compliment
        my talks, which was nice of them!), but it definitely make it easier for
        me to ask them for thoughts/feedback on software topics.
    &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;What HASN’T this done for me?&lt;/h2&gt;

&lt;p&gt;Now that we’ve talked about what conference speaking has done for me, let’s
talk about what it hasn’t done for me.&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;
        &lt;b&gt;I haven’t made a bunch of friends I talk to regularly&lt;/b&gt;: Some people seem
        to have close friendships with their speaking friends, but I don’t talk
        to most of mine regularly.  We mostly get together at conferences have
        dinner, talk about tech, and occasionally share thoughts on Twitter, but
        not much more than that (which is cool!).  I’m super grateful what we DO
        we share, but it&apos;s definitely a different kind of relationship.&lt;/li&gt;
    &lt;li&gt;
        &lt;b&gt;I haven’t gotten internet famous&lt;/b&gt;: I was expecting that after I gave my
        first couple of conference talks, I would have people lining up to hear
        what I had to say;  that’s just not the case.  I currently sit at ~550
        Twitter followers, no one has ever reached out to me to speak on a
        podcast, and I’m certainly not a “thought leader”. 
    &lt;/li&gt;
    &lt;li&gt;
        &lt;b&gt;I haven’t gotten invited to speak anywhere (or even accepted more
        frequently)&lt;/b&gt;: This sort of goes along with #2.  I haven’t been invited to
        speak anywhere yet, and my proposals still only get accepted ~25-30% of
        the time.  Maybe one day I’ll get invited to speak somewhere, but it’s
        not something I’m expecting in the near future.
    &lt;/li&gt;
    &lt;li&gt;
        &lt;b&gt;I haven’t gotten any job offers from speaking&lt;/b&gt;: I sometimes see a meme of “Speaking got me my
        next gig” floating around as ‘why you should speak’.  I don’t doubt that this
        has happened to other people, but it has never happened to me.  Speaking
        &lt;em&gt;has&lt;/em&gt; given me access to people who could refer me, but I still
        got rejected during the interview process.  Maybe it takes more time for strangers 
        to start giving you job offers from talks, but I don&apos;t know what the
        tipping point is.
    &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;So What?&lt;/h2&gt;

&lt;p&gt;So, where’s all that leave us?  Good question!  I don’t know! I think my
takeaways after two years of conference speaking are roughly:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;
        &lt;b&gt;Public speaking is cool, and I’ll keep doing it&lt;/b&gt;: There’s a lot of upside to
        public speaking: you get to meet nice people and someone else pays for you to
        travel around and learn stuff.  All of that is fun and if you’re into it, go do
        it! 
    &lt;/li&gt;
    &lt;li&gt;
        &lt;b&gt;Becoming internet famous is hard&lt;/b&gt;: I went into speaking expecting to give a
        couple of good conference talks and immediately have opportunities rolling in.
        That hasn’t happened, and I’m not sure how to make it happen.  My guess is if
        you want to reap the rewards of internet fame, you need to tailor your content
        or just produce lots of solid content.
    &lt;/li&gt;
    &lt;li&gt;
        &lt;b&gt;If you want to get started, work it into your day job if you can&lt;/b&gt;: Creating content is hard work; some people claim
        to be able to throw together slides the night before a conference, but it takes
        me at least 15-20 hours to create a polished talk.  I manage this by setting
        aside ~1-3 hours a week to “create content for recruiting” which means writing
        conference proposals, slide decks, or blog posts.  If you can swing that, I’d
        suggest trying it.
    &lt;/li&gt;
    &lt;li&gt;
        &lt;b&gt;(Slightly more speculative) You get what you put in&lt;/b&gt;: I get
        the sense that many people who really trumpet the value of public
        speaking/blogging put a lot of their time and energy into it.  If you really
        want to get those same benefits, my guess is you’ll have to invest similar
        amounts of time.  I’m not sure what the cost/benefit curve looks like,
        but if you find out, please do let me know!
    &lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Roadmaps vs. Projects</title>
   <link href="http://maltzj.github.io/posts/roadmaps-vs-projects"/>
   <updated>2019-04-21T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/roadmaps-vs-projects</id>
   <content type="html">&lt;p&gt;I had lunch with a friend yesterday, and he shared an interesting story.  He
was leading a large technical project at his company, and it started off fairly
normally.  They saw some fruit they thought would be low-hanging, ran the ROI
numbers, wrote a project plan with clear milestones that showed value along the
path, staffed the project, and started to deliver.&lt;/p&gt;

&lt;p&gt;Over time, they started to discover that the low-hanging fruit wasn’t so
low-hanging after all.  They had to change some old systems in order to get at
the low-hanging fruit, and the more they dug in, the more they realized that
they didn’t understand the tech debt that stood between them and their end
goal.&lt;/p&gt;

&lt;p&gt;They reevaluated the ROI at each step of the way.  On one hand, as they
discovered this new tech debt, they were paying it down and making changes which
would open up a whole class of errors.  On the other, their project was
slipping, management was getting antsy, they weren’t directly showing any ROI,
and the problems seemed to involve progressively more teams.&lt;/p&gt;

&lt;p&gt;Ultimately, my friend decided to cancel the remainder of the project.  He
also took all those technical hurdles which would enable large classes of work
and turned them into a technical roadmap for the team, so that they could
continue to unlock value in the future.&lt;/p&gt;

&lt;p&gt;This highlighted an interesting set of trade-offs between roadmaps and
projects.&lt;/p&gt;

&lt;h2&gt;Projects&lt;/h2&gt;

The distinguishing factors of projects are that they are:

&lt;ul&gt;
    &lt;li&gt;Clearly defined&lt;/li&gt;
    &lt;li&gt;Clearly staffed&lt;/li&gt;
    &lt;li&gt;Have a clear, specific goal with timelines&lt;/li&gt;
    &lt;li&gt;Are a relatively strong commitment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These characteristics make it very easy to rally a team around a project and
get people to start delivering.  The clear goals and staffing also makes
projects easy to track.  This is great if the team is delivering effectively,
but can create pressure if the team struggles to meet its goals&lt;/p&gt; 

&lt;h2&gt;Roadmaps&lt;/h2&gt;

The distinguishing factors of roadmaps is that they are.

&lt;ul&gt;
    &lt;li&gt;Aspirational&lt;/li&gt;
    &lt;li&gt;Interwoven within projects in order to achieve a larger goal&lt;/li&gt;
    &lt;li&gt;Less tied to timelines&lt;/li&gt;
    &lt;li&gt;Are a relatively weak commitment (i.e. they often change as circumstances indicate)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both of these tools are valuable tools for a tech lead, but you’ll want to
use them differently.  If there’s a clear project with known scope and direct
ROI, leaning on a project may be the right tool.  If you have a series of
efforts which provide value but culminate a far out, and possibly shifting,
goal, a roadmap may be more valuable.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Writing Good System Overviews</title>
   <link href="http://maltzj.github.io/posts/writing-system-overviews"/>
   <updated>2019-04-01T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/writing-system-overviews</id>
   <content type="html">&lt;p&gt;Over the years at Nuna, our data platforms have grown from small pipelines
which served simple analytics, to large, polyglot pipelines which can help
patients receive personalized doctor recommendations. As we’ve scaled, our
inline documentation and README’s for specific libraries have been helpful, but
haven’t been sufficient to help new hires understand how our whole system fits
together. In order to help our “Newnas” get up to speed faster, we’ve written a
different type of documentation: a system overview, detailing how the whole
system comes together.&lt;/p&gt;

&lt;h2&gt;What’s a System Overview?&lt;/h2&gt;

&lt;p&gt;No matter how well you’ve architected your system, at the end of the day,
it’s all just text. For someone to be productive in your system, they need a
mental model of how the system works in order to translate the text they’re
reading into higher level concepts. That’s where system overviews come in.&lt;/p&gt;

&lt;p&gt;System overviews are documents designed to create a mental map of how a
system works. When done well, they help provide the context new hires need to
start delivering code quickly and with confidence. When neglected, or written
poorly, system overviews can cause confusion for new members on the team as they
work to understand the cause of an issue.&lt;/p&gt;

&lt;p&gt;Building these mental maps may seem hard, but it only requires three key
steps.&lt;/p&gt;

&lt;h2&gt;Step 1: Design a block diagram to provide a birds-eye view of the
system&lt;/h2&gt;
&lt;p&gt;The first step in designing a mental map of the system is to create a visual
model. Create a block diagram where the major components are blocks and the
relationships between them are expressed as arrows. This diagram helps
developers build a baseline understanding of the system and begins to demystify,
and contextualize, the terms their teammates’ use when talking about their
work.&lt;/p&gt;

&lt;p&gt;It can be tempting to over-specify the details of this block diagram, but
it’s best to strive for brevity and clarity rather than completeness. It’s more
helpful to have a concise, rather than cluttered, diagram. You’ll be able to
better express the additional details in the next component of the system
overview.&lt;/p&gt;

&lt;h2&gt;Step 2: Write descriptions for each block&lt;/h2&gt;
&lt;p&gt;The block diagram introduces a rough mental model of how the system
interacts, but doesn’t provide the supporting detail explaining how each piece
operates. Understanding these details is essential to achieving a greater
awareness of how the system functions.&lt;/p&gt;

&lt;p&gt;This documentation doesn’t need to be an exhaustive description, but it
should answer some key questions about each component. These include:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;What is the purpose of this component?&lt;/li&gt;
    &lt;li&gt;What information does it take in?&lt;/li&gt;
    &lt;li&gt;How does it operate on the input?&lt;/li&gt;
    &lt;li&gt;What information does it produce?&lt;/li&gt;
    &lt;li&gt;Are there any special design considerations when making one of these?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The answers to these questions should be brief (2 paragraphs is a sweet spot)
and allow people to look at any class and start to understand roughly what it
does and how it fits into the system. Including these write-ups in your system
overview helps others have a better idea of where their bugs may be hiding, or
where to incorporate a new feature.&lt;/p&gt;

&lt;h2&gt;Step 3: Create a concrete example of the system in action&lt;/h2&gt;

&lt;p&gt;Close your system overview by creating a worked example to show step-by-step
how the pieces in your system solve a problem. This last step helps to cement
your readers’ understanding of the system, and turn theory into practice.&lt;/p&gt;

&lt;p&gt;Good examples contain a few key traits:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;
        &lt;b&gt;They are real&lt;/b&gt;: Resist the temptation to create an example filled with names
        like &lt;pre&gt;FooCleaner&lt;/pre&gt; or &lt;pre&gt;BarProcessor&lt;/pre&gt;. Names like Foo and Bar are convenient, but they
        don’t help to build a plausible mental model. A contrived, but relatable,
        example is much better.
    &lt;/li&gt;
    &lt;li&gt;
        &lt;b&gt;They include real, small code examples&lt;/b&gt;: Your system overview should contain
        code that demonstrates how to solve your example problem. This code should
        be long enough to help readers understand your descriptions, but shouldn’t
        go into too much detail.
    &lt;/li&gt;
    &lt;li&gt;
        &lt;b&gt;They touch the whole system&lt;/b&gt;: If something appears in your block diagram, it should also appear in your example so your reader can develop a complete mental model.
    &lt;/li&gt;

&lt;h2&gt;Keeping system overviews up-to-date&lt;/h2&gt;

&lt;p&gt;Once you’ve completed these three steps — designing a block diagram, writing
descriptions of each block, and creating a worked example — your system overview
is in a good place. That’s not to say that our work is done; we still need to
keep your system overview up-to-date as the system changes.&lt;/p&gt;

&lt;p&gt;New users to your system are the best monitors of existing documentation, so
have them review it as part of their ramp-up. After they’ve read it, have them
explain what they learned and ask questions. Afterwards, revisit the system
overview, and add any necessary detail to clarify any pieces that may be out of
date.&lt;/p&gt;

&lt;p&gt;Our system overviews are constantly evolving, but they’ve proven valuable in
helping to establish a high-level perspective of how our systems work. While
they require some time up-front to write, that investment has more than paid off
in terms of easier onboarding as our systems become more complex. A system
overview is never done, but we’ll keep evolving them as we update our systems
and find new ways to improve patients’ quality of care.&lt;/p&gt;

&lt;em&gt;Note: This initially appeared on the &lt;a
href=&quot;https://blog.nuna.com/writing-system-overviews-1d1fafb81f31&quot;&gt;Nuna Blog&lt;/a&gt;
I&apos;m just cross-posting it here&lt;/em&gt;


</content>
 </entry>
 
 <entry>
   <title>Start Side-Hustling</title>
   <link href="http://maltzj.github.io/posts/side-hustling"/>
   <updated>2018-10-20T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/side-hustling</id>
   <content type="html">&lt;p&gt;Back in university I worked in a media office, and it seemed like all the
creatives had two jobs in their life: their real job, and the thing they did on
the side.  Our graphic designers would run a consultancy, our photographers
would put together a magazine, and our videographers would were constantly
shooting for events or contests.&lt;/p&gt;  

&lt;p&gt;I once asked the head of our office about this, and he sagely responded
“everybody has to have a side hustle”.  Although I didn’t understand it at the
time, years later I’ve come to realize that he’s right: whether you’re a
videographer or a software engineer, having a side-hustle at work can be a
valuable way to grow your skills and impact.&lt;/p&gt;

&lt;h2&gt;Side hustling, what’s that?&lt;/h2&gt;

&lt;p&gt;A side hustle is pretty much anything you do which is not part of your
specific job responsibilities.  If you’re a software engineer, you could have a
side hustle where you help define and maintain your team’s code review
practices. Alternatively, you could spend time writing blog posts, or leading
brainstorming sessions about team direction.  You can even side-hustle outside
of your day job (we call those hobbies), but for this purpose we’ll just focus
on side hustles during your day job.&lt;/p&gt;

&lt;p&gt;Now you may be thinking to yourself “Why bother with side hustles?  Why not
just keep doing and let someone else take care of that messy, non-coding,
work?”  The simple reason is because side hustles represent a huge opportunity
for you and your team.&lt;/p&gt;

&lt;p&gt;Side hustle opportunities exist because there’s a problem that needs to be
solved and no ones currently solving it.  Chances are there’s a
problem brewing under the surface, but everyone else has been too busy to deal
with it; this is good news for you! It means there&apos;s an opportunity for you to step up,
&lt;a href=&quot;https://medium.com/@jean/how-to-lead-by-noticing-and-filling-in-gaps-e3b91506afd2&quot;&gt;fill that gap&lt;/a&gt;, and learn something new in the process.&lt;/p&gt;

&lt;p&gt;Take the above example of a team that doesn’t have clear code review
guidelines.  On a team of three people, it’s probably not such a big deal:
everyone has a social agreement about how code review should operate.  However,
as you onboard a couple of more engineers you notice that code reviews begin to
slow down, and maybe start to focus more on nitpicking than important
questions.&lt;/p&gt;

&lt;p&gt;At this point, the problem is probably not the most urgent one for the team,
so no manager or CEO is going to say “time to roll up my sleeves and fix this
team’s code review disagreements”.  However, the lack of code review standards
is a very real problem, and one which left unchecked will lead to slow code
reviews and a lot of grief for the team. If no one does anything and you
onboard four more engineers, your code reviews may descend into slow, grinding,
arguments.  Fortunately, if someone steps up and solves the problem now, before
it’s too late, the whole team will avoid this fate.&lt;/p&gt;

&lt;h2&gt;Side Hustles: Good For You Too&lt;/h2&gt;

&lt;p&gt;Side hustles don’t just help your team, they help you broaden your own
impact.  There’s always a limited number of technical problems to be solved, so
you may not always be able to lead a shiny new engineering project.  Side
hustles allow you to find a new challenge even when the rest of your job isn’t
pushing you to solve new challenges.&lt;/p&gt;

&lt;p&gt;Once you start taking on side hustles you’ll also find that they bring you
into contact with people you would have never otherwise met. These connections
are rarely immediately valuable, but they can be immensely useful as you look
for new opportunities, or even just a new way to solve problems in the
future.&lt;/p&gt;

&lt;h2&gt;Okay, so how do I side hustle?&lt;/h2&gt;

&lt;p&gt;Great! You’re now on-board with the idea of a side-hustle and you’re keen to
start your own, but you don’t know where to start.  How can you get started
side hustling?&lt;/p&gt;

&lt;h3&gt;Define The Problem You Want To Solve and Solve it Locally&lt;/h3&gt;

&lt;p&gt;First, you need to figure out what it is you want to solve and how to solve
it.  For me, this always starts with a problem that I’m experiencing for
myself.  Coming back to the example at hand I may say “I’ve been running into a
lot of disagreements on code review lately. How can I fix that”.&lt;/p&gt;  

&lt;p&gt;With that problem in hand, I next try to figure out how to solve it locally.
So, I may sit down and say “why do we do code review?” and “how can I make sure
we avoid bikeshedding in code reviews?”.  With those answers in hand, I’d try
to build a set of personal code review guidelines and see how they work.&lt;/p&gt;

&lt;h3&gt;Look to see how the problem and solution generalize&lt;/h3&gt;

&lt;p&gt;Once you’ve gotten a local solution to the problem, the next step is to
figure out how others view the same problem.  The best way to make this happen
is shockingly easy: talk to people and ask them how they feel about the same
problem.&lt;p&gt;

&lt;p&gt;For me, this often consists of setting up coffee meetings three groups:
peers with context on the problem, peers who are totally unfamiliar with the
problem, and a brief discussion with The Decider(s), people who could block or empower any
solution I come up with.&lt;sup&gt;1&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Generally these meetings consist of me saying &lt;em&gt;“Hey, I’ve been thinking about
    &lt;PROBLEM&gt;, and I’m thinking we should do &lt;SOLUTION&gt; about it.  What do you
    think about that?”.&lt;/em&gt; Generally I’m looking for a few things out of these
conversations: 
&lt;ul&gt;
    &lt;li&gt;
        &lt;b&gt;Is the problem a real problem, and is my solution on the right
            track?&lt;/b&gt;  If I casually mention this problem to two or three people and no one
        says “yes, we should totally do that”.  Chances are I’m looking at the problem
        the wrong way and need to go back to the drawing board.
    &lt;/li&gt;  
    &lt;li&gt;
        &lt;b&gt;Is there additional nuance on the problem?&lt;/b&gt; Frequently when I float ideas past people they’ll ask something I hadn’t considered. They’ll say something like  “yes, I totally
        agree that we should have code review guidelines.  How would we have those work
        across teams which have different codebases and release schedules?”  I generally
        file these pieces of feedback away and see how I can incorporate them into the
        project.
    &lt;/li&gt;  
    &lt;li&gt;
        &lt;b&gt;Possible allies or co-side-hustlers&lt;/b&gt; Ideally, whenever I’m taking on a new side-hustle, I want to have once person working on it with me.  This not only forces me to be accountable to someone, but also it provides a layer of redundancy and emotional support.  Finding
        someone who is excited enough about your solution to join forces isn’t
        necessary, but it is helpful.
    &lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Define a project plan and an MVP&lt;/h3&gt;

&lt;p&gt;Once you&apos;ve had your brief conversations and have gotten positive signals about your
direction, the next step is to actually define what you’re going to do to scale
up your idea.  You wouldn’t launch a big feature without first writing up a
design document; similarly, wouldn’t want to implement company-wide code review
guidelines without having a plan for how to draft, review, pilot, and finalize
them.  So write down a plan for your project and make sure it includes a set of
small milestones which allow you to start small, validate your idea, and then
grow from there.  Taking our example of code review guidelines, that plan would
look something like this:&lt;/p&gt;

&lt;ol&gt;
    &lt;li&gt;
        Draft key themes of code review and get them reviewed by senior
        engineers in 3 disparate areas
    &lt;/li&gt;
    &lt;li&gt;
        Take feedback create a first draft of code review guidelines, present to
        decider and previous engineers for feedback.
    &lt;/li&gt;
    &lt;li&gt;
        Create a second draft of guidelines, work through second draft until all
        parties are satisfied.
    &lt;/li&gt;
    &lt;li&gt;
        Create a final draft of guidelines, present it to other key technical
        stakeholders (maybe all principal engineers + managers-of-managers) and get approval
    &lt;/li&gt;
    &lt;li&gt;
        Circulate final draft to see if anyone has any blocking feedback
    &lt;/li&gt;
    &lt;li&gt;
        Share new guidelines with the org and put a plan in place to monitor
        their adoption.
    &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Notice how this plan doesn&apos;t try to solve the whole problem at once.  It
breaks the problem down into discrete steps and then layers on complexity only
once the foundations are solid.  Whatever your goal is, you want to define a
similar set of clear steps which provide lots of check-in points for others.&lt;/p&gt;

&lt;p&gt;Plan in hand, it’s time to get empowered to start
side-hustling.  Generally doing this consists of a meeting with The Deciders, who you
should have already identified and talked to.  If not, here&apos;s a quick rule of
thumb: if it’s a team-level change, that’s probably your manager; if it’s larger, it’s probably a
manager-of-managers.  Find your decider and tell them &lt;em&gt;“So I’ve been thinking
    about &lt;PROBLEM&gt; and I think we should do &lt;SOLUTION&gt; about it.  I’m thinking we
    can pilot this by doing &lt;PILOT-PROPOSAL&gt; and then
        &lt;GROW-FROM-THERE-IN-THIS-WAY&gt;.  What do you think about that?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For some people, this may seem weird.  “I’m telling my boss what we should
be doing?  Don’t they know what’s going on?”  Well, maybe, but it’s much more
likely that they have 25 other things which demand there attention, so if you
stroll into their office and say “hi, I’d like to solve one of those problems
for you”, their first thought will not be “get out of my office plebe”, it will
be “oh thank god someone is solving this problem for me.” Remember, the time
between something becoming a problem and the time when it becomes a fire can be
long, and filled with lots of pain.&lt;/p&gt;

&lt;p&gt;Of course, they won’t always say “yes” immediately, but they may push you to
revise/clarify a couple of plans.  However, so long as you vet your idea
up-front, chances are you should be able to move forward with your plan.&lt;/p&gt;

&lt;h2&gt;They said yes! Now what?&lt;/h2&gt;

&lt;p&gt;Great! You’ve gotten the okay for your plan.  Now what?? How can you do your
new project along with your “normal work”? The secret here is running your
side-hustle just like another project.&lt;/p&gt;

&lt;h3&gt;Work in Small Chunks&lt;/h3&gt;

&lt;p&gt;You wouldn’t run a big engineering project by just trying to
accomplish the whole thing all at once, and you don’t want to do that with your
side hustle either.  You should have defined an MVP, milestones, and a scaling
plan as part of the proposal you showed to The Decider. Now’s the time to use
that. If you haven&apos;t, then go make one.&lt;/p&gt;

&lt;p&gt;Start by working on the first milestone on your project. In our case, this
would mean just writing down some rough high-level principles and getting
feedback on those.  Execute on that piece 
effectively, document your learnings, and then come back to subsequent
milestones based on what you’ve learned.  Trying to do the whole thing at once
is a recipe for getting overwhelmed, so keep your focus small.&lt;/p&gt;

&lt;h3&gt;Find the time&lt;/h3&gt;

&lt;p&gt;Once you have that plan, it’s time to start working towards your first
milestone.  Again, you should be treating this like just another engineering
project.  Start by breaking down your first milestone into a set of individual
tasks, and begin working through them. You can even have bi-weekly planning
meetings where you establish a goal for the week and then myopically execute on
that.&lt;/p&gt;

&lt;p&gt;I also like to block off 30-60 minute sections at the end of a day as
“side-hustling time”.  During this time I put down my normal work and only work
on side-hustles.  This calendar time is important for me, as it serves as a
reminder to put down the urgent work I’ve been focused on, and refocus on
making forward progress on this important task.  It’s okay if I miss a couple
of these, but I try to make sure to have at least one or two a week so that the
project never slips into “neutral”.&lt;/p&gt;

&lt;p&gt;You may also find that as you work through these milestones you’re stuck and
don’t know where to go next.  That’s when it’s a great time to shoot an email
to The Decider and get some feedback from them.  Chances are they can unblock
you by pointing you towards a resource who can help you.  Don’t expect The
Decider to solve your problems, but they are useful if you’re at wit’s end and
don’t know where to turn.&lt;/p&gt;

&lt;h3&gt;Get regular feedback&lt;/h3&gt;

&lt;p&gt;As you start to accomplish, you want to make sure to check back with the
original person who you worked with to get sign-off.  As you hit each
milestone, report back to them with what you tried, what you learned, and where
you are thinking of going next. They may not be able to jump in and directly
lend a hand (remember, they’ve probably got other priorities), however, they
will be able to serve as a good sounding board for possible landmines on your
way forward.&lt;/p&gt;

&lt;p&gt;You’ll often find that this project feels a bit slow and plodding.  That’s
okay!  Your side-projects are never going to move as fast as the things you
spend the other 36 hours a week working on.  What’s important is that you keep
moving forward and showing progress.  If you do that, and you keep trucking
through obstacles, you’ll find that over time your pilot becomes a full-blown
solution.  It won’t be fast, but you’ll find that the people you meet and the
things you learn will make it worth the while.&lt;/p&gt;

&lt;p&gt;
&lt;sup&gt;1&lt;/sup&gt;The concept of deciders is universal, but I stole this particular
version of the idea from Jake Knapp&apos;s excellent &lt;a
   href=&quot;https://www.amazon.com/Sprint-Solve-Problems-Test-Ideas-ebook/dp/B010MH1DAQ&quot;&gt;Sprint&lt;/a&gt;
book.
&lt;/p&gt;

&lt;p&gt;A big thank you goes out to Michael Stephens, who reviewed early drafts of
this post.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Do You Really Need That JSON Array?</title>
   <link href="http://maltzj.github.io/posts/avoiding-json-arrays"/>
   <updated>2018-09-02T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/avoiding-json-arrays</id>
   <content type="html">&lt;p&gt;When building APIs, it’s common to run into a problem
which is basically a form of “We want an API that will support a list of
something.”.  In situations like this, it can be tempting to just send back a
JSON Array and call it a day.  However, I&apos;ve found that this is rarely the
right decision, and by making a slight tweak to this design you can make your
APIs much more extensible.&lt;/p&gt;

&lt;p&gt;To understand why structuring your response as a top-level JSON Array may be
a problem, consider the following: let’s say we’re trying to show a list of
restaurants in an application.  If we’ve naively serving up an array of
restaurants from our API, that means our responses will look something like the
following:&lt;/p&gt;

&lt;pre&gt;
[
    {
         “restaurant_id”: 1234,
         “restaurant_name”: &quot;My restaurant&quot;,
         “restaurant_cuisine”: &quot;Indian&quot;,
         ... 
    }
    ... 
]
&lt;/pre&gt;

&lt;p&gt;On the surface, this is totally fine: you can parse this JSON with any
library and handle it easily.  However, what happens if you want to do something
like add a list of suggested search filters that the user could drill down by?
With this API design you don’t have many options: you basically have to ship a
breaking API change in order to support the new feature or create another
endpoint.&lt;/p&gt;

&lt;p&gt;The shame of the situation is that it’s easily avoided.  If instead of
sending back a top-level JSON Array, we made our top-level element a JSON Object
with a single key, we would’ve ended up with a response which looked something
like the following:&lt;/p&gt;

&lt;pre&gt;
{
   “restaurants”: [
   {
       “restaurant_id”: 1234,
       “restaurant_name”: &quot;My restaurant&quot;,
       “restaurant_cuisine”: &quot;Indian&quot;,
       ... 
   }
   ... 
   ]
}
&lt;/pre&gt;

&lt;p&gt;Now if we want to add search filters we can just add another key to the
top-level JSON object, giving us something like:&lt;/p&gt;

&lt;pre&gt;
{
   “restaurants”: [
       ... 
   ],
   “suggested_search_filters”: [
       ... 
   ]
}
&lt;/pre&gt;

&lt;p&gt;Boom! Instant backwards compatibility with no hassle.&lt;/p&gt;

&lt;p&gt;There are probably cases where adding the additional layer of nesting is not
the right decision, but I’ve found that the flexibility provided by the approach
outweighs the costs in all situations I’ve encountered.  So the next time you’re
thinking about building an API to surface a list of content and you’re tempted
to reach for a JSON Array, ask yourself “should I make this an object instead”,
it might just save you some headache down the road.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Practicing as a Software Engineer</title>
   <link href="http://maltzj.github.io/posts/applying-practice-to-software"/>
   <updated>2018-07-11T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/applying-practice-to-software</id>
   <content type="html">&lt;p&gt;Continuing to grow  as a software engineer can become increasingly hard as
you become more experienced.  When you first learn to code, there are an
infinite number of new things to learn; every algorithm, framework, or concept
is brand new, so there’s learning at every turn.  Best of all, this happens
organically.  If you&apos;ve never written code before, the mere act of typing into a
computer and making it work is challenging and pushes you to grow.  Over time
though, that growth path starts to peter out: there are only so many language
features you can learn or libraries to master before you start hitting
diminishing returns. Past that point, the skills you need to learn become
abstract questions like “how do I design better software” or “how do I lead a
team”, and to grow those we need to think a little differently about how we
build skills.&lt;/p&gt;

&lt;h2&gt;Why&apos;s it gotta be so hard?&lt;/h2&gt;

&lt;p&gt;One of the reasons it&apos;s easy to hit a plateau as a software engineer is much
the educational material which exists is about accumulating knowledge.  If you
want to learn something, whether it&apos;s how to use MVP architecture, or how to
leverage experience to become successful technical lead, you can probably find
some content which will give you the knowledge.  However, as Anders Erickson
points out in his book &lt;em&gt;&lt;a
        href=&quot;https://www.amazon.com/Peak-Secrets-New-Science-Expertise/dp/1531864880&quot;&gt;Peak:
        Secrets From The New Science of Expertise&lt;/a&gt;&lt;/em&gt;, this accumulation of knowledge alone is
not enough.  Knowledge is great, but it&apos;s useless on its own; knowledge must be
turned into &lt;em&gt;skills&lt;/em&gt; for it to be valuable, and there&apos;s only one
way to turn knowledge into skills: practice&lt;/p&gt;.

&lt;p&gt;Practice is something software engineers rarely talk about. We frequently say
things like &quot;surround yourself with the best people&quot; or &quot;stay up to date by
going to conferences&quot; and assume that people will take those opportunities
and just figure out how to turn them into new skills.  Sometimes this works well
and you get motivated people who immerse themselves in knowledge and learn how
to apply it to their own lives.  However, this approach can also
result in people being confused and frustrated if they hit a wall and are
unsure needs to change in order to improve.&lt;/p&gt;

&lt;p&gt;Ideally, we can break this cycle by using “deliberate practice”,  which
&lt;em&gt;Peak&lt;/em&gt; describes as “the gold standard of practice”.  In deliberate
practice, students work with experts in their field to master specific
exercises which push them to improve against clearly defined criteria.  If
you&apos;re training a skill with clear measures of excellence, like ballet or
musical performance, this type of practice simply cannot be beat.&lt;/p&gt;

&lt;p&gt;Unfortunately, we can’t apply deliberate practice in its strictest form to
software engineering; we don’t have the same objective measures of “goodness”
that ballet dancers do, so we can’t design specific training programs to reach
those measures.  However, that doesn’t mean we should throw practice out the
window.  We can take the lessons from deliberate practice and apply them to what
Erickson calls &lt;em&gt;purposeful practice&lt;/em&gt;.  Purposeful practice doesn’t have
the same objective measures of success as deliberate practice, but it does have
a few key elements which make it far better than doing the same thing repeatedly
and hoping for new results.  In particular, purposeful practice uses focused exercises which push the
practitioner outside their comfort zone.  These exercises incorporate feedback
so that the practitioner can see where they are improving.  This means that we
can apply purposeful practice to pretty much any skill by doing the
following:&lt;/p&gt;

&lt;ol&gt; 
    &lt;li&gt;
        Decide on a thing you would like to learn
    &lt;/li&gt; 
    &lt;li&gt;
        Figure out an excercise which will force you to do that thing better by pushing your
        boundaries in some way.
    &lt;/li&gt; 
    &lt;li&gt;
        Get feedback on how you did on the exercise
    &lt;/li&gt; 
    &lt;li&gt;
        Figure out how to do the exercise better next time
    &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;Applying This to Software Engineers&lt;/h2&gt;

&lt;p&gt;Now that we have this model of practice, but how can we apply it to improving
as software engineers? The first step would be to identify the skills which make
great software engineers.  While a full list is outside the scope of this post,
it&apos;s safe to say that all great software engineers can:&lt;/p&gt;

&lt;ul&gt; 
    &lt;li&gt;
        Write correct code with good velocity 
    &lt;/li&gt; 
    &lt;li&gt;
        Effectively communicate orally with peers
    &lt;/li&gt; 
    &lt;li&gt;
        Design extensible and maintainable systems
    &lt;/li&gt; 
&lt;/ul&gt;

&lt;p&gt;Next we need to define exercises that incorporate feedback for how we’re
doing. This is where things start to get tricky.  How exactly can we tell if
we’re writing “more correct code”?  Do we shoot for 100% test coverage?  Start
using TDD and just assume that things are getting better?  Measure the number of
outages over the course of six months?  None of these really feel like they can
provide rapid feedback on whether we’re actually doing a better job at writing
correct code.  It&apos;s easy to see that and throw your hands up, saying &quot;well,
software is hard, we&apos;ll just do our best and keep muddling through&quot;, but there
are some ways that we can push through that and design a purposeful practice
regimen around these skills.&lt;/p&gt;  

&lt;p&gt;The first is what &lt;em&gt;Peak&lt;/em&gt; calls a &lt;em&gt;top gun&lt;/em&gt; approach to
practicing, named after the famous flight school where students continually
dogfight against top pilots.  In the &lt;em&gt;top gun&lt;/em&gt; approach, you don’t know
the right way to practice ahead of time, so you just try to do the task you want
to improve at.  After you’re done, you go back and evaluate what worked and what
didn’t.&lt;/p&gt;  

&lt;p&gt;Top gun pilots do this by reviewing videos of their dogfights,
and software engineers can do the same with regular retrospectives where they
discuss how to improve.  These are most frequently applied to team processes,
but it’s also possible to apply the same methodology to your own skills.  For
example, after shipping a large feature, you could ask “What parts of the system
had few errors when we went live?” “What classes of errors did we encounter?”
and “How will I prevent those errors next time?”.  In this way, we can treat our
past projects as exercises which help us improve in future projects.&lt;/p&gt;

&lt;p&gt;What if we’re unhappy with this approach, and we want something more
direction?  Another option proposed by Erickson is that we watch expert
performers perform a task and see how they accomplish the task.  This helps us
understand their mental representations so that we can emulate the same mental
representations ourselves.  With those representations in hand, we can design
specific exercises which help build up each aspect of the desired mental
representation.&lt;/p&gt;

&lt;p&gt;For example, it may be hard for us to specifically train &quot;how should we
design better systems&quot;, but we may see that a great software engineer (perhaps
one of our mentors) follows a three step process: they list list out all the
major for the system, group the requirements them into a variety of different
groupings, and list the tradeoffs between different groups.  Once we understand
this process, we can create exercises which help grow each of these skills and
get feedback from the engineer on how well we did in each step.&lt;/p&gt;

&lt;h2&gt;What does it look like in practice?&lt;/h2&gt;

&lt;p&gt;So now we&apos;ve talked about this idea of applying a practice-first mindset to
growing our skills as a software engineer, but what does that look like in
practice?  Let’s take a couple of examples to see how we could apply our model
of purposeful practice to improve in a variety of areas. &lt;/p&gt;

&lt;h3&gt;Technical Leadership&lt;/h3&gt;

&lt;p&gt;&lt;b&gt;What&apos;s the class of skills to improve?&lt;/b&gt; Choosing the right solution for
the current circumstances&lt;/p&gt;

&lt;p&gt;&lt;b&gt;What&apos;s a specific skill to improve?&lt;/b&gt; Generating Multiple approaches to
solving a problem before settling on one.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;What&apos;s an exercise?&lt;/b&gt; Before deciding on an implementation direction,
write down all of the options along with their pros and cons.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;What&apos;s the feedback mechanism?&lt;/b&gt; After generating a list of ideas, make
a decision and show it to a senior member of the team (seeking feedback from an
expert performer).  Ask if they have any pros/cons that may have been missed,
and which decision they would make.  If different than the decision, discuss why
they would make that and help get a clearer idea of what mental representations
we should use in the future.&lt;/p&gt;

&lt;h3&gt;Becoming a Better Code Reviewer&lt;/h3&gt;

&lt;p&gt;&lt;b&gt;What&apos;s the class of skills to improve?&lt;/b&gt; Code reviewing&lt;/p&gt;

&lt;p&gt;&lt;b&gt;What&apos;s a specific skill to improve?&lt;/b&gt; Taking time to evaluate the code
review as a whole rather than just focusing on the individual pieces.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;What&apos;s an exercise?&lt;/b&gt; Before clicking &quot;submit&quot; on a code review, take a
moment to list alternative ways that we could approach this problem.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;What&apos;s the feedback mechanism?&lt;/b&gt; Take a &lt;em&gt;top gun&lt;/em&gt; approach and
review the same code as someone else.  See if you come up with similar to
suggestions to them; if not, figure out how you can create similar suggestions
to their sin the future&lt;/p&gt;

&lt;h3&gt;Becoming a better communicator&lt;/h3&gt;

&lt;p&gt;&lt;b&gt;What&apos;s the class of skills to improve?&lt;/b&gt; Communication&lt;/p&gt;

&lt;p&gt;&lt;b&gt;What&apos;s a specific skill to improve?&lt;/b&gt; Succinctly communicate ideas to a
variety of audiences.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;What&apos;s an exercise?&lt;/b&gt; Mentally collect major bullet points before
starting to talk.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;What&apos;s the feedback mechanism?&lt;/b&gt; Take a &lt;em&gt;top gun&lt;/em&gt; approach and
ask a teammate for whether they thought you were too verbose or too brief in
your statement.  If so, try to and more or less content as appropriate in the
future.&lt;/p&gt;

&lt;p&gt;That just gives a few ways that we can apply this mindset of practice to
growing skills as a software engineer.  Almost all of them though follow a
similar pattern: they’ve taken a complex skill and devised specific exercises to
improve that skill, along with feedback mechanisms to see if we’re actually
improving.  After that, it’s a matter of doing the practice until you’re happy
with the results.  Of course, this doesn’t throw knowledge accumulation out the
window.  You still need knowledge to understand which skills to grow and how to
build them.  However, you want to be sure to combine any knowledge you gain with
a practical practice path in order to really get the most out of what you
learn.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Effective Feature Flagging on Mobile</title>
   <link href="http://maltzj.github.io/posts/feature-flagging"/>
   <updated>2018-05-14T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/feature-flagging</id>
   <content type="html">&lt;p&gt;Feature flagging is a great way to reduce risk by allowing features to be
turned off remotely, but only if it&apos;s done correctly.  I recently incorrectly
feature flagged some code at Yelp! and wanted to share some lessons learned to
help avoid similar issues in the future.&lt;/p&gt;
&lt;h3&gt;
    First, Some Context
&lt;/h3&gt;
&lt;p&gt;
    Our team is currently working on migrating our App&apos;s analytics system to
    use a new event logging library.  Getting correct metrics is important, so we
    decided to start by dual logging all of our analytics through our legacy library 
    and the new library and then comparing them for consistency.  We had tested
    the new library, but we weren&apos;t totally sure how it would behave in
    production, so we decided to put it behind a feature flag in
    case anything blew up.
&lt;/p&gt; 

&lt;p&gt;
    This process initially seemed super easy: as all we needed to do was add some
    code in our base Application class that looked like:
&lt;/p&gt;
&lt;p&gt;
  &lt;pre&gt;
    LegacyAnalyticsSystem legacySystem = LegacyAnalyticsSystem();
    if (Features.new_logging_infra.isEnabled()) {
        // The legacy system publishes its analytics as a stream.  The new
        // subscribes to that and transforms them.
        newAnalyticsSystem.subscribeTo(legacySystem.analyticsStream()); 
    }
  &lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
    Before shipping we did all our normal dilligence.  We wrote unit tests for
    the new system and tested cases where the flag was both on and off.
    Everything came up green, so we happily shipped to production with the flag turned on.
&lt;/p&gt;

&lt;p&gt;
    Once our release rolled out, our backend engineers started reporting issues
    where we were logging incorrect data from the new system. That wasn&apos;t great
    news, but fortunately, we had a feature
    flag we could use to run it off! We went into our feature flagging system,
    turned the feature off, and... the errors still persisted. This left us
    feeling a little like &lt;a
        href=&quot;https://www.youtube.com/watch?v=nZMwKPmsbWE&quot;&gt;WTFMate&lt;/a&gt;?
&lt;/p&gt;

&lt;p&gt;
    After thinking about it a little more, we realized that we had incorrectly
    feature flagged this code.  Our feature flag was only getting checked in our
    base Application class on app startup.  This meant that the application
    would need to get killed and restart in order for our changes to take
    effect.  Talk about bad!
&lt;/p&gt;
&lt;h3&gt;
  What should we have done instead?
&lt;/h3&gt;
&lt;p&gt;
    We had the right idea with feature flagging this code, but our error here
    was WHEN we actually checked the feature flag.  Instead of feature
    flagging the point of subscription to the existing analytics system, we
    should have feature flagged the actual point of logging.
&lt;/p&gt;
&lt;p&gt;
    This would mean that our Application class had code that looked
    something like: 
    
    &lt;pre&gt;
        legacySystem = LegacyAnalyticsSystem();
        newAnalyticsSystem.subscribeTo(legacySystem.analyticsStream())
    &lt;/pre&gt;

    Then, in our subscribeTo method, we should have included code
    which looked something like:
    
    &lt;pre&gt;
      fun subscribeTo(analyticStream: Observable&lt;Analytic&gt;):
        analytisStream.subscribe({
            if(Features.new_logging_infra.isEnabled()) {
                // Send the log event via the new infrastructure.
            }
        })
    &lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
    This would check whether the feature flag is enabled before sending any
    analytics, which would have meant that any changes on the backend were
    immediately seen on the client.
&lt;/p&gt;
&lt;h3&gt;
  So what did we learn from all this?
&lt;/h3&gt;
&lt;p&gt;
  This process left me with two big takeaways.
  &lt;ol&gt;
      &lt;li&gt;
          Feature flagging is great, especially for new infrastructure that
          you want to expose to production situations, but you&apos;re not entirely
          confident in.
      &lt;/li&gt;
      &lt;li&gt;
          Make that if you are feature flagging a piece of code, that the flag
          itself is checked frequently.  A flag that is only checked once per
          application lifecycle is harder to turn off than one which is checked
          frequently.
      &lt;/li&gt;
  &lt;/ol&gt;
&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Wan't to Make a Change? Stop Talking and Start Listening at Android Makers</title>
   <link href="http://maltzj.github.io/posts/make-a-change-android-makers"/>
   <updated>2018-04-20T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/make-a-change-android-makers</id>
   <content type="html">&lt;p&gt;I recently had a chance to give a talk at Android Makers about how to work
with cross-functional stakeholders to create change.  While I&apos;m not an expert on
that by any means, it was a good learning experience for me to decompose my
thoughts on how I work with others. The video is now live on Youtube.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/NHp9OcRObCM&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen&gt;&lt;/iframe&gt;
</content>
 </entry>
 
 <entry>
   <title>Protecting Your Source Using Code Review To Improve Your Application Quality at Droidcon Boston</title>
   <link href="http://maltzj.github.io/posts/protect-your-source"/>
   <updated>2018-03-27T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/protect-your-source</id>
   <content type="html">&lt;p&gt;I recently had the chance to speak at Droidcon Boston about one of my favorite
topics: code review.  A video of the talk is now on Youtube.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/mnc14X87HkM&quot;
                                 frameborder=&quot;0&quot; allow=&quot;autoplay;
                                 encrypted-media&quot; allowfullscreen&gt;&lt;/iframe&gt;
</content>
 </entry>
 
 <entry>
   <title>Finding Mentorship After Onboarding</title>
   <link href="http://maltzj.github.io/posts/post-onboarding-mentorship"/>
   <updated>2017-12-23T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/post-onboarding-mentorship</id>
   <content type="html">&lt;p&gt;One of the first questions I got after &lt;a
    href=&quot;https://vimeo.com/217618450&quot;&gt;giving my talk about mentoring new
    hires&lt;/a&gt; was (paraphrasing) &quot;how do you deal with effectively mentoring people who are 1+ year
into their time on the team?&quot;.  This question has stuck with me over the past
year, mostly because I didn&apos;t have a particularly coherent answer at the time,
and I stumbled through answering it.  Over the past year I&apos;ve spent
a lot of time thinking about my own process of acquiring mentorship, and I
finally have a (more) cohesive answer to &quot;how do you handle mentorship after
onboarding&quot;.  I wanted to take a chance to share those thoughts, in hopes that
people who are 1+ year into their time on a team can chart their own path to
getting the mentorship and resources they need to succeed &lt;/p&gt;

&lt;p&gt;One of the challenging things about talking about post-onboarding mentorship
is that it&apos;s very individualized, which makes in hard to systematize in the same
way onboarding can be systematized. Everyone who is joining a new team has
(broadly speaking) the same set of mentorship requirements. Regardless of their
level of experience, they will need to get familiar with the codebase,
understand the team&apos;s culture, and learn any essential processes that they’ll
need to be following.  This set of standardized requirements makes it pretty
easy to define a team/company-wide ramp-up process that everyone can follow.&lt;/p&gt;

&lt;p&gt;However, things get more tricky when it comes to mentoring after onboarding.
After the newhire phase it’s dang near impossible to create a one size fits all
approach for mentoring engineers. Everyone has such a wide variety
of skills, working styles, and goals that it would be folly to establish a
single specific process for everyone.&lt;/p&gt;

&lt;p&gt;What this means in practice is that if you want to receive effective
mentorship after onboarding, the process needs to start with you understanding
what you want to learn.  Do you want to level up your architecture game so that
you can build more maintainable code, or do you want to learn how to understand
your users better so that you can find the right features that match their
needs? Both of these are valid options, but they require finding mentors with
very different skills.&lt;/p&gt;

&lt;p&gt;It&apos;s worth noting here that figuring out an answer to “what skills do I want
to learn?” is incredibly abstract and can lead to overwhelming decision
paralysis.  One way I overcame this was to decompose this question into three
simpler ones:
    &lt;ul&gt;
        &lt;li&gt;Who do I look up to?&lt;/li&gt;
        &lt;li&gt;Why do I look up to them?&lt;/li&gt;
        &lt;li&gt;What do I want to be working on ~5 years from now?&lt;/li&gt;
    &lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;After running through this exercise I discovered two things. First, everyone
I looked up to was both a strong technical contributor and an empathetic
communicator. Second, I want to work on data-focused products in the future.
This led me to seek out mentors and opportunities which taught me to be a
stronger communicator who can build data products.  The specific skills that you
admire may be totally different, but what&apos;s important is that you find clusters
of skills that matter to you; these are the skills that you&apos;ll want to focus on
getting mentored.&lt;/p&gt;

&lt;p&gt;You may find this exercise gives you a large number of mentorable skills, but I always
try to pare it down to one or two key areas to focus on at a time. It can be tempting to
attempt to get better at everything all at once, but this eventually becomes a
fool&apos;s errand.  At a certain point, it becomes important to invest in &lt;a
    href=&quot;http://freakonomics.com/podcast/grit/&quot;&gt;nuance over novelty&lt;/a&gt; and buckle down on improving one or two skills before you
focus on leveling up other ones.  One other important thing to keep in mind as
you&apos;re deciding on what to learn next is you can both learn from a prospective
mentor and apply in practice. You may want to learn everything about machine
learning, but if you don’t have any opportunities to actually apply any ML
concepts, then it may not be right to find an ML engineer as a mentor because
you won&apos;t be able to practice what you learned.&lt;/p&gt;

&lt;p&gt;Once you&apos;ve whittled to one or two skills, you may think &quot;zomg, there&apos;s no
way I can find someone to teach me these two very different things.&quot;  That&apos;s
okay! There probably isn&apos;t one person who can help you learn all the skills
you&apos;re looking to grow.  Every mentor will come with their own skills and
experience, none of which will perfectly match what you need.  Instead, once you
have your list of skills of you should strive to form a &lt;a
    href=&quot;https://hbr.org/2017/01/your-career-needs-many-mentors-not-just-one&quot;&gt;career board of
    directors&lt;/a&gt;, each of whom teaches you a unique skill, rather than a single mentor
who can teach you everything. Fortunately, if you&apos;ve followed identified people
you admire, you&apos;ve already got a head start on finding who you want to sit on
this board&lt;/p&gt;

&lt;p&gt;Once you&apos;ve identified potential candidates for your personal board, it&apos;s
time to reach out and see if any of them is willing to be a resource for you.  Surprisingly, I&apos;ve seen many
people get stuck after they find a prospective mentor and ask “how do I get them
to mentor me?”. The answer is simple: you just ask them to help you with
something specific! SO MANY people (myself included) find someone awesome that
they wish could learn from, only to have self-doubt creep in and say “oh, that
person’s too busy/important to get coffee with me” or “I should figure this out
on my own and not bother them”.  In these cases, self-doubt needs to slow its
roll for a few reasons:
    &lt;ul&gt;
        &lt;li&gt;The worst thing that happens is they don’t respond or say “sorry, I’m
            too busy”: No one is going to laugh you off an email chain for asking
            for help, and if they do, congratulations, you have just found a jerk
            who you decidedly did NOT want to teach you.  Most people genuinely do
            want to help, so the worst response you’ll likely get is “sorry, I’m too
            busy” and life goes on.&lt;/li&gt;
        &lt;li&gt;Mentoring is incredibly high-leverage for the mentor: A good mentor can
            spend 30-60 minutes with you a month and make you tremendously more
            effective.  If you work at the same company as your mentor, this means
            them mentoring you is a net win for THEIR CAREER.&lt;/li&gt;
        &lt;li&gt;Mentoring feels good: Everyone likes feeling listened to, and mentoring
            is an opportunity to have someone listen to your perspective for an
            extended period of time.  That makes mentoring enjoyable for your mentor
            as well as yourself.&lt;/li&gt;
    &lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;Once you’ve kicked self-doubt to the curb, you can email your potential
mentor to ask to talk with them about whatever you’re interested in.  If you’re
unsure what to say, try this handy email template I use to get coffee with
literally anyone:&lt;/p&gt;

&lt;p&gt;
    &lt;em&gt;
        Hello &amp;lt;person&amp;gt;! My name is Jon Maltz and I’m a &amp;lt;thing you would be able to
        relate to&amp;gt;.  I saw your &amp;lt;thing that makes me think you’re
        awesome&amp;gt; and would
        love to talk more about &amp;lt;concept&amp;gt;.  Do you have time to get coffee over the
        next couple weeks to talk about that?
    &lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;Again, the worst response you get here is “sorry, I’m too busy”, but chances
are they’ll say “I’d be happy to”, and you can go meet with them.  When you do
this, make sure to come prepared with specific questions that they will have a
unique perspective on.  Your mentor&apos;s time is valuable, and you want to show
that you value it by asking them questions that you can&apos;t answer with a Google
search.&lt;/p&gt;

&lt;p&gt;This first interaction may surprise you: you may come prepared expecting to
have answers handed to you on a silver platter only to find that your
prospective mentor isn&apos;t helpful in the way you expected.  That&apos;s okay! There&apos;s
no harm in thanking them for their time and going on your way to find someone
who does fit with what you&apos;re looking for.  When I&apos;m looking for a new mentor, I
like to run &quot;mentoring adoption tests&quot;, where I get coffee with a couple of
different people to see which one I communicate best with. Once I find someone I
click with, I&apos;ll send a follow-up email that looks something like this.&lt;/p&gt;

&lt;p&gt;
    &lt;em&gt;
        Hello &amp;lt;person&amp;gt;! Thanks for taking the time to discuss &amp;lt;interesting
        thing&amp;gt; with me.  I’m working on improving &amp;lt;growth area&amp;gt; and really
        appreciated your perspectives on &amp;lt;concept you discussed&amp;gt;.  Is it cool if
        I schedule time every &amp;lt;cadence&amp;gt; to get your perspectives on the
        challenges I encounter as I try to &amp;lt;do thing which will allow me to
        apply the things you&apos;re teaching me about&amp;gt;?
    &lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;Bear in mind that you will probably want to meet people at different
    frequencies depending on their availability and what you&apos;re trying to
    learn. Some people may be really helpful at figuring out the tactical
    day-to-days of your problems and are worth meeting frequently&apos;, while others
    provide more high-level perspective and don&apos;t provide as much regular value.
     My own collection of mentors at Yelp contains 3 people, all whom I meet at
    different intervals.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Scott Triglia: Tech Lead&lt;/b&gt;. I now get coffee with Scott once a month in
sessions that I jokingly refer to as &quot;Scott and Maltz contemplate the universe&quot;,
where I ask a high-level question like &quot;how do you think about working in a
technology where you&apos;re not an expert?&quot; and we talk about them for 30 minutes.
 These don&apos;t provide anything specific for me to do THAT DAY, but they do
provide me a framework for thinking about tackling larger-scale problems.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Justin Cunningham: Technical Lead&lt;/b&gt;.  Justin is the overall lead for our
data efforts at Yelp, so has more context on my day-to-day than Scott does.  We
have weekly 1:1s where we discuss how to move forward with my piece of a larger
project.  These give me tremendous insight into the specifics of delivering a
large project, keep my piece of the project aligned with the overall vision, and
teach me lots about delivering a large, multi-team software project.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Brad Barry: Eng. Manager&lt;/b&gt;. Brad and I get together every 2-4 weeks to
talk about what we&apos;ve got going on in our life/work.  Brad&apos;s been out of the
code-writing game for about a year now, so I rarely ask him about anything
technical.  At the same time, he is tremendous at thinking about how to teach
and grow others, so I will usually pitch him my latest blog post or conference
talk to get his thoughts on how others might receive that message.  This outside
perspective helps me get a broader perspective about how to create content
that&apos;s useful for other engineers.&lt;/p&gt;

&lt;p&gt;I hope that gives you a sense for the variety of different mentoring
relationships that I&apos;ve built up, and how I’ve structured each relationship
differently depending on what I want to learn.  All of these relationships
evolved organically as my own needs + questions evolved, but they all started
out the same way: I found an area where I wanted to grow, I identified someone
who could help me improve in that area, and I scheduled time to regularly bring
them clear questions that were on my mind.&lt;/p&gt;

&lt;p&gt;Happy learning!&lt;/p&gt;


</content>
 </entry>
 
 <entry>
   <title>Adventures in Gradle Dependency Resolution</title>
   <link href="http://maltzj.github.io/posts/dependency-management-gradle"/>
   <updated>2017-12-11T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/dependency-management-gradle</id>
   <content type="html">&lt;p&gt;Currently at Yelp I&apos;m working on building out our next generation
experimentation infrastructure, a large part of which involves writing a Java
wrapping library around a Rust library which does most of the heavy lifting of
our experimentation. Yelp is mostly a Python shop, but
we also have a few backend Java services; this meant that when we went to
implement our Java wrapper, we decided to just write it once in pure
Java and write a thin layer of Android code on top of that to
provide Android-specific capabilities like logging to adb.&lt;/p&gt;

&lt;p&gt;This means we have a single Gradle project which is built something like
this:&lt;/p&gt;

&lt;img src=&quot;http://maltzj.github.io/assets/gradle-project-structure.png&quot; /&gt;

&lt;p&gt;Since our Java code communicates with our Rust code over &lt;a
    href=&quot;https://en.wikipedia.org/wiki/Foreign_function_interface&quot;&gt;FFI&lt;/a&gt;, we can&apos;t just pass
configuration objects into our Rust library to control its initialization  Instead,
we need to pass the desired configuration to the Rust library as a JSON string,
and then let Rust create the necassary models on its side of the FFI boundary.
Unlike Android, which provides the
org.json APIs by default, Java does not come with JSON capabilities built-in, so
we needed a library which could create JSON strings for us.  We took a quick
look at GSON and Moshi, but were both way heavier than we needed for our
purpose. Instead,  we decided to use Google’s json-simple library, which exposes a very similar API
to the one that Android exposes.&lt;/p&gt;

&lt;p&gt;From there, library development went swimmingly until we went to add the
latest version of our Android library to the Yelp app.  When we did that, our
app would fail to build with the following error:&lt;br /&gt;
&lt;pre&gt;
  Warning: Conflict with dependency junit:junit. Resolved versions for 
  app (4.10) and test app (4.12) differ
&lt;/pre&gt;.&lt;/p&gt; 

&lt;p&gt;What the heck is going on here?  Digging around in &lt;a
    href=&quot;https://developer.android.com/studio/test/index.html&quot;&gt;the Android
    documentation&lt;/a&gt;, we
discovered that Android creates an instrumented version of your app for
testing, and will yell at you if there are any difference between the
instrumented version of your app and the normal production one.  This is super
helpful, as it prevents you from say, using OkHttp 3.5 in your app and relying
on some behavior there, but testing against OkHttp 3.3, where that behavior
doesn&apos;t exist.&lt;/p&gt;

&lt;p&gt;We started bug hunting by first looking in both our library code and app code to see where JUnit 4.10
was coming from. However, we quickly found that we declared JUnit 4.12 for all
of our compile configurations in both our Java wrapper and our Android application.
What&apos;s more, we reasoned that Gradle&apos;s &lt;a
    href=&quot;https://docs.gradle.org/current/userguide/dependency_management.html&quot;&gt;default
    dependency resolution strategy&lt;/a&gt; should
always choose JUnit 4.12 even if we did let 4.10 slip in as a dependency.&lt;/p&gt;

&lt;p&gt;After scratching our head for a while, someone on our team had the idea to
look at the &lt;a
    href=&quot;http://central.maven.org/maven2/com/googlecode/json-simple/json-simple/1.1.1/json-simple-1.1.1.pom&quot;&gt;pom.xml
    for json-simple&lt;/a&gt; (Gradle uses Maven&apos;s pom.xml format for
resolving dependencies, even though it is a separate build system) and
discovered that JUnit is declared as a dependency of json-simple. This meant
that when we pulled in json-simple as a implementation dependency, we were also
packaging all of JUnit 4.10 with our app!  Then, when Gradle went to build our
app, it was finding a conflict between the version of JUnit we accidentally
dragged in and the version we cared about for our tests.&lt;/p&gt;  

&lt;p&gt;The solution to this was to include a little snippet in our app’s build.gradle file. 
    &lt;pre&gt;
    allprojects {
        configurations.all {
            resolutionStrategy {
                eachDependency { DependencyResolveDetails details -&gt;
                    switch(details.requested.group) {
                        case &apos;junit&apos;:
                            details.useVersion junitLibVersion
                            break
                    }
                }
            }
        }
    &lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;This snippet basically tells Gradle “anytime someone specifies a JUnit
dependency, ignore the version that they set and use junitLibVersion (in our
case 4.12)”.  For more about ResolutionStrategies, you can check the &lt;a
    href=&quot;https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html&quot;&gt;Gradle
    docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After we added this snippet, we could build and test the app.  Huzzah!  However,
we hadn&apos;t solved the root cause of our problem (JUnit being packaged with our
production app), so another snag came up when we
went to merge to master and create a release build.  All of our tests passed,
but the our release apk build step failed with the following errors:&lt;/p&gt;
&lt;p&gt;
    &lt;pre&gt;
    Warning: there were 5 instances of library classes depending on program classes.
    You must avoid such dependencies, since the program classes will be processed,
    while the library classes will remain unchanged.
    (http://proguard.sourceforge.net/manual/troubleshooting.html#dependency)
    &lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;When we went to the link, we saw the following description of this error:&lt;/p&gt;

&lt;p&gt;
    &lt;em&gt;
        In Android development, sloppy libraries may contain duplicates of classes
        that are already present in the Android run-time (notably org.w3c.dom,
        org.xml.sax, org.xmlpull.v1, org.apache.commons.logging.Log,
        org.apache.http, and org.json). You must remove these classes from your
        libraries, since they are possibly inconsistent, and the run-time libraries
        would get precedence anyway.
    &lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;&quot;Libraries that use org.json&quot; sounded a lot like us at first glance,
especially since json-simple&apos;s package is awfully similar to org.json.  However,
json-simple has its JSONObject class packaged as org.json.simple.JSONObject
whereas Android packages this as org.json.JSONObject. Java uses fully qualified
names in order to resolve classes, so we determined that this warning was not
due to duplicate JSON packages.  After a bit more head scratching, we then went back to the initial console output
and saw the following:&lt;/p&gt;

&lt;p&gt;
    &lt;pre&gt;
    11:27:32 Warning: library class android.test.AndroidTestRunner extends 
                      or implements program class junit.runner.BaseTestRunner
    11:27:32 Warning: library class android.test.InstrumentationTestCase extends 
                      or implements program class junit.framework.TestCase
    11:27:32 Warning: library class android.test.InstrumentationTestSuite extends 
                      or implements program class junit.framework.TestSuite
    11:27:32 Warning: library class android.test.suitebuilder.TestSuiteBuilder$FailedToCreateTests 
                      extends or implements program class junit.framework.TestCase
    &lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;It turns out that our JSONObjects were not the problem at all, it was JUnit!
It turns out that forcing JUnit 4.12 resolved our dependency mismatch between
test and real apps, but we were still packaging JUnit with our actual
application! This version of JUnit was providing classes that Android already
had a copy of, and Proguard was helpfully making sure that we didn&apos;t get
nondeterministic behavior.&lt;/p&gt;

&lt;p&gt;Once we figured this out, the fix was straightforward.  We didn’t actually
need JUnit at runtime, and we’re already compiling it in for our tests.  So we
can just exclude all of our JUnit dependencies when we depend on the Bunsen
library.  This is easily done with Gradle by including:&lt;/p&gt;

&lt;p&gt;
    &lt;pre&gt;
    implementation(&quot;com.yelp.library:$libVersion&quot;, {
            exclude group: &apos;junit&apos;
        })
    &lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;After that, everything worked beautifully and we merged to master
smoothly.&lt;/p&gt;

&lt;p&gt;Looking back on this process, a few things stand out as learning experiences
for me:
    &lt;ol&gt;
        &lt;li&gt;
            &lt;b&gt;Take time to read your error messages:&lt;/b&gt;  It’s so easy to read one line
            and think you know what’s going on, like when we saw “oh, an issue with
            org.json”.  Before implementing, take the time to read glean as much
            information as you can from your logs.  It’ll make your debugging
            process go way quicker.
        &lt;/li&gt;
        &lt;li&gt;
            &lt;b&gt;Gradle isn’t black magic:&lt;/b&gt; it’s a tool like any other: Gradle’s syntax
            can be funky and hard to understand, but it’s still just a whole bunch
            of code that’s running.  Understanding how Gradle resolves dependencies
            and how its syntax works can go a long way towards solving your build
            woes.
        &lt;/li&gt;
        &lt;li&gt;
            &lt;b&gt;Make sure you understand the code you&apos;re copying from
                StackOverflow:&lt;/b&gt; There are a lot of solutions to Gradle problems
            which involve slapping together some poorly understood answer on
            StackOverflow.  This leads to Gradle continuing to feel like Black
            Magic.  Make sure to take the time to understand what this solution that
            someone suggested is actually doing before adding it into your codebase.
            One great way I&apos;ve found to do this is instead of copying and pasting
            code, take the time to write it yourself.
        &lt;/li&gt;
    &lt;/ol&gt;
&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>A/B Testing From The Ground Up At Droidcon SF</title>
   <link href="http://maltzj.github.io/posts/ab-testing-from-the-ground-up"/>
   <updated>2017-11-04T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/ab-testing-from-the-ground-up</id>
   <content type="html">&lt;p&gt;I recently had a chance to talk about A/B testing at Droidcon SF as part of a
talk called &quot;A/B Testing From The Ground Up&quot;.  The goal with this talk was to
give attendees an overview of all the moving parts needed to get an A/B test up
and running on mobile.  The video should be up in a couple of weeks.  In the meantime, the
slides for the talk are below.&lt;/p&gt;


&lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;90d628648c8d47938d4a8d84421e1ff4&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
</content>
 </entry>
 
 <entry>
   <title>Multiplying Your Impact Through Mentoring at Droicon UK</title>
   <link href="http://maltzj.github.io/posts/multiplying-your-impact-through-mentoring-london"/>
   <updated>2017-10-27T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/multiplying-your-impact-through-mentoring-london</id>
   <content type="html">&lt;p&gt;I recently presented a new and improved version of my talk on &quot;Multiplying
Your Impact Through Mentoring&quot; presentation, this time at Droidcon London.  A
friend at Yelp suggests that the third time is the best time for any
presentation, and after the fourth presentation it&apos;s time to retire the talk.  I
definitely felt like that was true this time, so I just need to find one last
time to present this talk and ride off into the sunset.&lt;/p&gt;

&lt;p&gt;The video recording is also really well done, and you can watch that at&lt;a
    href=&quot;https://skillsmatter.com/skillscasts/10524-write-less-code-and-get-more-done-multiplying-your-impact-through-mentoring&quot;&gt;the
    official Droidcon UK website&lt;/a&gt;&lt;/p&gt;

&lt;script async class=&quot;speakerdeck-embed&quot;
              data-id=&quot;aab4e6af3995418c92b60c7c727128ff&quot;
              data-ratio=&quot;1.77777777777778&quot;
              src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
</content>
 </entry>
 
 <entry>
   <title>The Benefits of Shipping Code In Small Chunks</title>
   <link href="http://maltzj.github.io/posts/shipping-small-diffs"/>
   <updated>2017-09-30T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/shipping-small-diffs</id>
   <content type="html">&lt;p&gt;One of the more unintuitive things in professional software development is
the idea that you should break your code up into small, fully functioning
chunks, rather than shipping it all as one big change. After all, wouldn’t more
changes mean more code reviews, more pushes, and more opportunities for
production to break, all of which slow down the time spent actually building
useful features? Yes, shipping more changes does absolutely require doing more
of all the above. However, it also has a myriad of benefits which make it the
better and more scalable, approach to shipping code.&lt;/p&gt;

&lt;h3&gt;Shipping small changes helps you ship code faster&lt;/h3&gt;
&lt;p&gt;Every change you make adds complexity into your system: the larger the
change, the more complexity it is likely adding to your system. This complexity
comes in two forms: the obvious complexity of the new lines code you’re adding,
and also the more insidious complexity of how each part of that change interacts
with the rest of the system.&lt;/p&gt;

&lt;p&gt;In software, any one mistake can break our system, so anyone responsible for
reviewing your code must both understand all the new code and also how it
interacts with the existing system before they’re able to provide effective
feedback and approval. This need for context building slows down code review
feedback cycles and means that you to wait longer for your change to be fully
reviewed. Every second of this review is a second you lose context on the code
you wrote, meaning the longer you have to wait for a code review, the longer it
will take you to respond to that feedback.&lt;/p&gt;

&lt;p&gt;If you ship code in small changesets you avoid this productivity pit by
making shipping new features in smaller, more well understood steps. This helps
your reviewers quickly understand your code and provide effective feedback and
saves you from having to rebuild context on the code you wrote. The end result:
faster code reviews, faster approvals, and faster changes shipped to
production.&lt;/p&gt;

&lt;h3&gt;Shipping Small Changes Means Wrangling With Version Control Less
    Frequently&lt;/h3&gt;
&lt;p&gt;Large changes take a long time to implement, test, and review before they can
ultimately be merged into master. While this is happening, the rest of your team
isn’t standing still: they’re working on shipping their own features, some of
which may be changing code you depend on. Similarly, you may be changing code
that your teammates are depending on for their own feature to work.&lt;/p&gt;

&lt;p&gt;Unfortunately, these dependencies between these on these features is silent,
and you’ll only see your teammates changes when you merge with their branch, and
visa versa. Doing this regularly with multiple feature branches quickly becomes
a headache, and you’ll find yourself wishing for a better way to make sure
people are not adversely affected by others’ work.&lt;/p&gt;

&lt;p&gt;Fortunately, there’s an easy way to do this: have small changes that you
continually merge into master. This workflow improves this situation for
everyone involved. You benefit because your feature is constantly being built
off the latest changes in master, meaning you’re not surprised by a merge
conflict, and your teammates get consistent visibility into how your feature is
changing the code base, so their world doesn’t get changed out from under them.
It’s a win-win for everyone!&lt;/p&gt;

&lt;h3&gt;Smaller changes represent smaller, more reversible decisions.&lt;/h3&gt;
&lt;p&gt;If you have a change that implements a large feature from in one big bang
commit, it represents a lot of decisions about the future of your codebase. For
example, a fully functioning backend API endpoint may include decisions about
your database tables, how the business logic should be architected, and
ultimately about the public API your service will expose.&lt;/p&gt;

&lt;p&gt;Tying all these decisions together in one large change means that you’ve
coupled all these decisions together, and a change in any one may result in you
having to rework large parts of your feature even after you thought it was
“done”. This is no bueno both in terms of your own happiness and making you the
most productive.&lt;/p&gt;

&lt;p&gt;You can avoid this conundrum by shipping your code in small changes which
make small decisions that validate any assumptions you have and give any
additional information. If your decision is validated, awesome, you can go and
build out the next piece of your feature. However, it turned out to be bad, then
you don’t have many sunk costs, so it’s easy to revert that change and do it
better the next time.&lt;/p&gt;

&lt;h3&gt;Shipping small changes forces you learn how to manage large projects&lt;/h3&gt;
&lt;p&gt;Project management is a different game than just writing code yourself. While
writing code solo is an exercise in design and implementation, project
management is a constant game of managing dependencies, scoping out work, and
figuring out what things your team can do to keep moving forward while their
dependencies fall into place.&lt;/p&gt;

&lt;p&gt;When you ship features as small changes, you learn to do exactly this. You
understand the end state, take a look at what you have now, and figure out where
you can slice off a logical piece of functionality to ship. This forces you to
learn how to simplify an ambiguous task into logical components, ship components
which unblock future work, and manage dependencies between your code reviews to
make sure that you never block yourself.&lt;/p&gt;

&lt;p&gt;If you start building the skills starting from your smallest changes, then
managing a large project with multiple developers is not a foreign skill set to
master. Instead, it’s just a matter of using the same skills you’ve already
learned, but applying them on a larger scale.&lt;/p&gt;

&lt;p&gt;Like many other things, shipping your code in small changes is not a panacea
which will solve all your development woes. Just because your code goes to
production 300 lines at a time doesn’t mean that you’ll suddenly have no bugs
and there won’t be any overhead in coordinating between your team. However, it
does do is create a process which allows teams to regularly and safely deploy
code to production while minimizing the amount of time spent stepping on each
others’ toes. I think that’s something we can all agree is a good thing.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Discussions on Building Widely Adopted Infrsatructure</title>
   <link href="http://maltzj.github.io/posts/thoughts-from-tech-roundtable"/>
   <updated>2017-08-09T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/thoughts-from-tech-roundtable</id>
   <content type="html">&lt;p&gt;Every month, a group of engineers at Yelp get together for something we
call the &quot;technical roundtable&quot;, which is basically a big discussion group on
technical topics that are challenging the company.  Often, these focus on specific pieces of
Yelp&apos;s technical infrastructure, but our most recent one touched on time
management for mid-level to senior engineers. A lot of the takeaways were
initially surprising but obvious in retrospect, so I figured I&apos;d share them with the
wider internet.&lt;/p&gt;

&lt;p&gt;First, one of our engineering managers talked about the concept of &lt;a
    href=&quot;https://crew.co/blog/urgent-vs-important/&quot;&gt;important vs. urgent&lt;/a&gt;,
which is a common guiding framework for making sure you don&apos;t fall into the
busyness trap.  He also discussed leveraging your time, which Edmund Lau covers really effectively in his book
&lt;a
    href=&quot;https://www.amazon.com/Effective-Engineer-Engineering-Disproportionate-Meaningful/dp/0996128107&quot;&gt;The
    Effective Engineer&lt;/a&gt;. Both of these are useful frameworks, but you can
just go read the primary sources to find out more about them.&lt;/p&gt;

&lt;p&gt;One interesting concept he touched was the idea of
giving up responsibilities as a way to foster organizational health.  The basic
idea is this: over time it&apos;s easy to accumulate a bunch of small, disparate
responsibilities like running learning groups which benefit your team/company but are not central to your
core job of shipping software.  It can be tempting to keep these
responsibilities forever, after all, you have the most context on them, and it
seems like anyone else who picked them up would only do 80% as well.&lt;/p&gt;

&lt;p&gt;Our presenter argued that these types of low-leverage activities are exactly the things
that you should be giving up to more junior engineers to help them grow.  First
and foremost, it frees up your time, so yu can focus on higher-leverage
activities for yourself.  Second, it&apos;ll be a stretch for them, which means that
they&apos;ll gain new skills and become more productive members of your team.
Finally, they&apos;ll be able to spend more time focused on that task, so it&apos;ll
probably get done better in the long run. He closed with a quote from our old
SVP who would always ask &quot;can they do it 80% as well as you now?  If so, they&apos;ll
be doing it 120% as well as you in a month&quot;, which I felt really succinctly sums
up the idea.&lt;/p&gt;

&lt;p&gt;The second part of the event was a &quot;point/counterpoint&quot; disccussion, where a
variety of engineers got together to discuss the pros/cons of spending our time
in various ways.  I got placed into the &quot;writing code&quot; breakout group, where one
of our infrastructure engineers suggested that it isn&apos;t a question of writing
too much/too little code, but rather writing the right code and reusing
infrastructure where appropriate.  This became a question of &quot;how do we
make sure everyone knows about the tools that they can reuse so they don&apos;t build
their own custom solution?&quot;&lt;/p&gt;

&lt;p&gt;We discussed the contours of this problem and came up with a few ways to deal
with it that feel generally applicable:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;
        If you&apos;re trying to build a piece of infrastructure that will be
        generally useful, you have to understand other engineers&apos;
        problems/needs.  Very often it&apos;s easy to solve our particular version of
        the problem in a clean, maintainable way, but ignore edge cases that may
        be important to other developers. This is fine if you just
        want a one-off solution, but if you want to make some truly reusable
        systems, it&apos;s important to put your PM hat on and understand your users&apos; 
        (i.e other engineers&apos;) needs before implementing a solution.
    &lt;/li&gt;
    &lt;li&gt;
        Any piece of infrastructure needs to solve its problem exceptionally
        well. This is rooted in the idea that it&apos;s generally hard to go modify
        some code you don&apos;t have context on rather than building a system from
        scratch. If an individual
        developer is confronted with the choice of &quot;go modify someone else&apos;s 60%
        solution that  to make it fit my use case&quot; vs.
        &quot;Go write a 60% solution which solves my own problems&quot; it may just be
        quicker to write the whole thing from scratch.  However, if that same system solves
        95% of her hard problems , it&apos;s much more likely that the same developer 
        will do some up-front work to just use what exists. 
    &lt;/li&gt;
    &lt;li&gt;
        Finally, and perhaps most surprisingly, we all agreed that it&apos;s
        important to make sure you have a PR push to make other engineers aware
        of what you&apos;ve built. On a small team, this can be as simple as an email + message
        to your Slack channel saying &quot;hey, did you know about this cool new
        thing we have&quot;, but that probably isn&apos;t sufficient when you have a team
        of engineers getting innundated with emails. Our most successful
        infrastructure projects have built a critical mass of support by going
        out and showing other people how it solves their use case, building out
        features and documentation in the process. In this way, things like our
        &lt;a
    href=&quot;https://engineeringblog.yelp.com/2016/07/billions-of-messages-a-day-yelps-real-time-data-pipeline.html&quot;&gt;Data
    Pipeline&lt;/a&gt; have built a 
        critical mass of awareness such that the first thing people think of
        when they&apos;re trying to stream data across Yelp.
    &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A lot of these ideas feel really obvious in retrospect, but it&apos;s also really
easy to fall into the trap of producing another 60% solution to that just solves your team&apos;s
version of a problem.  It seems like the best solution we&apos;ve found as an
industry is to have infrastructure teams who are incentivized to serve internal
developers combined with feature teams which use those tools and make a
judgement call about whether they should build something generally applicable or
something which just fits their use case. This approach seems to help us get
along, but doesn&apos;t feel perfect, and I&apos;d love to hear if there are any large
software teams which strike this balance really well.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Ship Great Apps Faster By Collaborating With Designers</title>
   <link href="http://maltzj.github.io/posts/shipping-better-apps-by-collaborating-with-designers"/>
   <updated>2017-07-04T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/shipping-better-apps-by-collaborating-with-designers</id>
   <content type="html">&lt;p&gt;Whenever I hangout with mobile developers at meetups, I hear a bunch of
misconceptions tossed around, but one of the most pernicious is the belief that
designers are head-in-the-clouds artists, throwing pixels around without concern
for what it will mean to implement their creation. On the surface, this
comparison is apt; both artists and designers create visual artifacts out of
ink, paper, and pixels. Dig a little deeper into what designers do every day
though, and you will discover that that &lt;a href=&quot;https://medium.com/@raveeshbhalla/lesson-1-design-is-not-art-68c05277bfb2&quot;&gt;design is not art&lt;/a&gt;. Rather, design is a problem solving discipline which tackles a different, but complementary, set of problems to the ones engineers solve when creating a product. Once engineers internalize this idea of designers as problem solvers and not artists, it opens up a whole new mode of collaboration which allows for otherwise impossible products to be shipped.&lt;/p&gt;

&lt;p&gt;Unfortunately, most product and engineering teams operate in a way which
makes building this type of understanding difficult. Many teams make problem
definition and ideation solely the realm of designers and product managers with
engineers only getting involved once a mock-up is mostly finalized.&lt;/p&gt;
&lt;p&gt;In this world, it’s easy to see why engineers see designers as artists and
not problem solvers. If all an engineer sees is a Sketch file with some
redlines, it’s easy to be blind to all the work that went into figuring out what
to put on the design, and instead focus on the pixel massaging necessary to make
it look good.&lt;/p&gt;
&lt;p&gt;This process failure isn’t a problem in the happy path of product
development: designers propose solutions which fit easily within the platform
constraints, and engineers are able to implement them with some light back and
forth. Unfortunately, very few mock-ups can be implemented on this happy path.
Maybe the mock-up proposes adding a bunch of custom one-off dimensions to the
layout, which will make it hard to maintain in the future. Or perhaps there’s an
animation which seems simple, but would actually take weeks to implement (I’m
looking at you, keyboard animations on Android). What’s a team to do in this
case?&lt;/p&gt;
&lt;p&gt;The choice I hear all too frequently is to push-and-pull until one side
“wins”. Either the design is implemented as-is, regardless of platform standards
and technical debt incurred, or the feature gets axed as “technically
infeasible”. This type of thinking is a classic example of &lt;a
href=&quot;http://www.beyondintractability.org/essay/positional-bargaining&quot;&gt;positional bargaining&lt;/a&gt;, with designers and engineers negotiating against each other about
what the final product should look like. Both of these miss the point though, as
what they should really be asking is “what are we trying to solve in the first
place, and how can we build a solution which gets us there in the best way
possible?”&lt;/p&gt;
&lt;p&gt;Once the problem has been reframed that way then folks on both sides of the
table can start to work together to make it a reality. Animations can be
changed, dimensions tweaked, and platform-specific widgets can be used to
replace the custom solution that was initially designed. All of these changes
work together to create a product that solves the same problems for users, but
can be shipped faster and with more maintainable code.&lt;/p&gt;
&lt;p&gt;This promised land of faster shipping, happier teams, and satisfied users
sounds great, but getting to this type of collaboration does not happen
overnight. It requires a large amount of education for both designers and
developers so that they can understand the impacts of ignoring the others’
concerns.&lt;/p&gt;
&lt;p&gt;Fortunately, Google has started shouldering some of the burden by doing an
all-out Material design education push. This has helped designers understand the
principles behind how to build beautiful Android applications, and it has helped
engineers understand the types of problems their design teams aim to solve
day-in and day-out. At the same time, the Material guidelines are just that:
guidelines; sometimes they will need to be bent, or even broken in order to
solve a particular problem. In those cases, there is no substitute for engineers
and designers understanding some core principles of how the other discipline
works.&lt;/p&gt;
&lt;p&gt;So if you’re an engineer, and you encounter a design which seems like it has
some unforeseen technical consequences, take time to talk about those challenges
and the impact they’ll have on your project. And if you’re a designer sharing a
mock-up, don’t throw some redlines on a sketch file and assume your engineers
will understand ideas like grouping, and consistency; take time to educate
engineering teams on the “why’s” of a particular design, including some of the
fundamental principles they may not even be aware of. You may just be surprised
at the end result.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Curious of what this looks like in action?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;When we redesigned the Yelp Android application in 2014, all the mock-ups
called for bottom tabs even though the Android design guidelines specifically
told us not to do it. Our engineers read those design guidelines and expressed
concerns about the mock-ups the design team, citing concerns about platform. Our
design team listened to our concerns, explained why we wanted persistent tabs in
the application, and showed all of the other possible iterations, along with an
explanation about why something like top tabs (which were standard at the time)
were insufficient. At the same time, the initial mock-ups called for those tabs
to stay consistent, but the screen content would still animate. We tried A LOT
of different ways to make this happen, but short of rewriting the whole app to
use Fragments (which would’ve been a mammoth undertaking), or doing some janky
UI tricks on every Activity, we couldn’t figure out how to make this happen. As
a result, we decided to just remove transitions entirely from our app. We were
all bummed that we couldn’t get the type of beautiful transitions that we
initially wanted, but we delivered the most important parts of the design and
didn’t build a mountain of technical debt.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A big thanks goes out to &lt;a href=&quot;https://twitter.com/brianika&quot;&gt;Briana
        Como&lt;/a&gt; and &lt;a href=&quot;https://www.linkedin.com/in/ramya-mallya-a427213a/&quot;&gt;Ramya Mallya&lt;/a&gt;, both of whom
    helped tremendously in providing context and editing for the thoughts
    here.&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Multiplying Your Impact Through Mentoring at Chicago Roboto</title>
   <link href="http://maltzj.github.io/posts/mulltiplying-your-impact-through-mentoring"/>
   <updated>2017-04-20T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/mulltiplying-your-impact-through-mentoring</id>
   <content type="html">&lt;p&gt;I recently presented an updated version of my &quot;Multiplying Your Impact
Through Mentoring&quot; presentation at Chicago Roboto.  The audience had some really
great questions which made me realize I need to think more deeply about some
aspects of mentoring and update my presentation the next time around.  The
slides that I presented are below&lt;/p&gt;

&lt;script async class=&quot;speakerdeck-embed&quot;
              data-id=&quot;520c97d9404d48e9b19840cdc3ab2d02&quot;
              data-ratio=&quot;1.77777777777778&quot;
              src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
</content>
 </entry>
 
 <entry>
   <title>Effective Interviewing Through Storytelling</title>
   <link href="http://maltzj.github.io/posts/effective-interviewing-through-storytelling"/>
   <updated>2017-03-23T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/effective-interviewing-through-storytelling</id>
   <content type="html">&lt;p&gt;This weekend I had the pleasure of getting to attend the &lt;a
    href=&quot;http://blooming-coast-2140.herokuapp.com/&quot;&gt;AI In Action&lt;/a&gt; Spring
2017 hackathon at Claflin University in Orangeburg South Carolina.  AI in Action
focuses on empowering K-12 students in rural South Carolina by teaching them to
code.  While I was there I gave a presentation on an aspect of interviewing that
I think is really under-coached: communication.  These are the slides from that
presentation.&lt;/p&gt;

&lt;script async class=&quot;speakerdeck-embed&quot;
              data-id=&quot;9dd2c396e8e048e387c8ee2db452bf3e&quot;
              data-ratio=&quot;1.77777777777778&quot;
              src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
</content>
 </entry>
 
 <entry>
   <title>Supercharging your Code Review With Collaboration</title>
   <link href="http://maltzj.github.io/posts/supercharging-code-review-with-collaboration"/>
   <updated>2017-03-14T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/supercharging-code-review-with-collaboration</id>
   <content type="html">&lt;p&gt;Software engineers always talk about how code reviews are &lt;a
    href=&quot;https://blog.codinghorror.com/code-reviews-just-do-it/&quot;&gt;the single biggest
thing to improve your code quality&lt;/a&gt;, but we often forget that putting your
hard-written code up for review can be scary. We invest a lot of time in making
sure that our code is perfect, so submitting it to someone for their critique
can feel like putting part of our identity up for critique.&lt;/p&gt;
&lt;p&gt;Fortunately for you, prospective code reviewer, there’s something you can do
to help. By being conscious of the language you use when suggesting revisions,
you can preemptively allay the concerns of your reviewee and supercharge your
code reviews. Best of all, it only requires tweaking a few phrases in your
vocabulary.&lt;/p&gt;
&lt;h3&gt;Getting started: Focus your critical feedback on the code, not the people
    who wrote the code.&lt;/h3&gt;
&lt;p&gt;One of the first keys to building safety as a reviewer is to make it clear
that any feedback you give is not about the code’s &lt;em&gt;author&lt;/em&gt;, but rather a comment
on the code &lt;em&gt;itself&lt;/em&gt;. This can seem complicated, but there’s a dead simple way to
get started accomplishing this: remove the word “you” from your code review
vocabulary.&lt;/p&gt;
&lt;p&gt;It’s a little challenging to get started with this new, you-free lifestyle,
but you’ll find that it pays huge dividends. In fact, once you’re aware of it,
you’ll find the sneaky three letter word has been cropping up all over the
place, making situations adversarial when they should feel collaborative. Worst
of all, chances are, your “you’s” have probably been popping up when they’ve
actually been referring to the code all along!&lt;/p&gt;
&lt;p&gt;Let’s take a look at a fairly innocuous code review comment:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“You’ve really tightly coupled your classes here. That may cause some
    problems down the road.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My heart skips a little when I read that, and I’m not even the one who wrote
the code! By immediately focusing on “you”, this comment can speak right to &lt;a
    href=&quot;http://blog.startupinstitute.com/2016-09-08-overcoming-imposter-syndrome/&quot;&gt;the
    little voice&lt;/a&gt; which says “I’m no good because my code is no good”. Once that
little voice starts to talk, &lt;a
    href=&quot;https://www.vitalsmarts.com/crucialskills/glossary/#q21&quot;&gt;conversational
    safety&lt;/a&gt; starts to go out the window,
and it’s taking collaboration right along with it.&lt;/p&gt;

&lt;p&gt;Fortunately, in many cases, if you do a mental find/replace for “you” with
“the code”, you get something much more collaboration friendly, like:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“This code here looks really tightly coupled. That may cause some problems
    down the road”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Phew! Look at how much chest-tightness that eliminated. This comment no
longer references the code review author at all, and instead it only focuses on
something much more objective: the code itself. Now that we’ve shifted that
focus, we can employ a couple more techniques to make others receptive to your
feed back.&lt;/p&gt;
&lt;h3&gt;Next Up: Think of your comments as suggestions, not dictations&lt;/h3&gt;
&lt;p&gt;No one likes to be told what to do, and code review is no exception to this.
At the same time, one of your responsibilities as a reviewer is to get your
reviewee’s code to a place that your team is comfortable shipping it, which
sometimes requires getting them to change things they may feel attached to.&lt;/p&gt;
&lt;p&gt;How to resolve this tension? Try not to make your comments dictations but
rather suggestions which open up space for discussion. To look at how we can do
this, let’s continue with our well-intentioned feedback from above, but this
time with a slight modification.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“The code here looks really tightly coupled. It should be refactored into
    class A and Class B”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This statement scores high marks for focusing on the code, but it could use
some improvement in the collaboration department by dictating the solution to a
problem. This comment may be correct, but it pushes the discussion into a realm
where it may seem like you’re forced to make &lt;a
    href=&quot;https://www.vitalsmarts.com/crucialskills/glossary/#q27&quot;&gt;the fool’s
    choice&lt;/a&gt;. If the only
options presented are “keep the code as it stands” or “take your reviewer’s
suggestion” then there’s not an obvious space to agree with the premise (tight
coupling) but propose a new solution.&lt;/p&gt;
&lt;p&gt;Much like our safety-building find/replace, the way to avoid this trap is
fairly simple: rephrase your suggestion from a dictation to a question about a
particular direction. Applying that transformation to our above comment, we get
a comment that looks like:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“The code here looks really tightly coupled. What if it got refactored it
    into class A and class B?”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Holy moly! What a difference three words and a punctuation change makes!
Instantly upon reading this question, you probably started trying to answer this
question in your head, and we don’t even have anything real to refactor! Just
imagine if we were talking about a real code review!&lt;/p&gt;
&lt;p&gt;Maybe the end result of this is that you move in the suggested direction,
maybe you don’t do anything, or maybe you find some third path that makes
everyone satisfied. Regardless of the direction, what was once a code review
commandment is now a full-blown code review collaboration.&lt;/p&gt;
&lt;p&gt;But we’re not done yet, there’s still a final form that our code review can
evolve into, and all we need to do to make that happen is use one simple
word.&lt;/p&gt;
&lt;h3&gt;Look for places to use “we” instead of “you”&lt;/h3&gt;
&lt;p&gt;We talked above about how and why to avoid using “you” in code reviews, but
really we only suggested one possible other direction: talking about the code
directly. What’s a code reviewer to do when they actually need to refer to a
person then? In those cases, save yourself a character and swap your “you”s for
“we”&lt;/p&gt;
&lt;p&gt;This matters because we live in a world of &lt;a
    href=&quot;http://www.extremeprogramming.org/rules/collective.html&quot;&gt;collective
    code ownership&lt;/a&gt;, which means that any code that your teammate puts into
production immediately becomes everyone’s responsibility. If a change breaks at
2 AM, Pagerduty isn’t going to take the time to git blame the offending line;
it’s going to wake someone up, and that someone may be you.&lt;/p&gt;
&lt;p&gt;This means that code review isn’t just a time to make sure that the code is
the best it can be. It’s a time to also make sure that it’s code that the whole
team is comfortable owning and maintaining. By using “we” in your code reviews,
it reminds everyone involved that the goal is creating a great end product for
the team. Plus, it’s super simple!&lt;/p&gt;
&lt;p&gt;We can take our previous comment:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“The code here looks really tightly coupled. What if it got refactored it
    into class A and class B?”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;And wordsmith it into&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“The code here looks tightly coupled, which may come back and bite us
    down the line when we want to make changes. What if we refactor it now into
    class A and class B?”.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Wham! Not only have we given a rationale for why we’re suggesting a
particular change, but also we’ve communicated it in such a way that it’s clear
that both the author and reviewer feel like they’re on the same side. Both
parties want flexible, maintainable code, and this comment sets the two of them
up to work towards that goal together, rather than as adversaries.&lt;/p&gt;
&lt;p&gt;With those three small changes: removing the word “you”, focusing on the
code, using “we”, and phrasing suggestions as questions, our code review
toolbelt has received a serious level-up. These new tools won’t immediately
change how your code review operates, but with continued application you’ll find
that an activity which was once an unproductive chore will turn into a valuable
opportunity to work with your team to help ship the best possible software.&lt;/p&gt;
&lt;p&gt;That’s not a bad outcome for shuffling around a couple of words and changing
a punctuation mark.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A big thank you for this post goes out to &lt;a
    href=&quot;https://www.linkedin.com/in/or-weizman-557aa88/&quot;&gt;Or&lt;/a&gt;, the best editor-in-chief I
know at Yelp, and &lt;a href=&quot;https://twitter.com/carmiendo&quot;&gt;Carmen&lt;/a&gt;, who inspired many of the thoughts here.&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Slides From Multiplying Your Impact Through Mentoring</title>
   <link href="http://maltzj.github.io/posts/multiplying-your-impact-through-mentoring"/>
   <updated>2017-02-05T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/multiplying-your-impact-through-mentoring</id>
   <content type="html">&lt;p&gt;I gave my first big boy conference presentation today at DevFest Minnesota!  The
topic was &quot;Multiplying Your Impact Through Mentoring&quot;, which has been rattled
around in my head a while because I think we as an industry do a pretty poor job
of training mentors.  The slides are below.&lt;/p&gt;

&lt;script async class=&quot;speakerdeck-embed&quot;
              data-id=&quot;efea572165364645bf4a3fd247562ba4&quot;
              data-ratio=&quot;1.77777777777778&quot;
              src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
</content>
 </entry>
 
 <entry>
   <title>Asking Great Questions on the Internet</title>
   <link href="http://maltzj.github.io/posts/asking-great-questions"/>
   <updated>2017-01-27T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/asking-great-questions</id>
   <content type="html">&lt;p&gt;We’ve all been there before: you’re chugging away on a technical problem and
suddenly you hit a brick wall you just can’t seem to get over. You’ve turned
down every imaginable path, but still you’re getting behavior that seems like it
was created by some sort of deity just to spite you. Fortunately, there is hope!
Many projects, both enterprise and open source, maintain chat channels and
mailing lists that you can use to ask questions to get yourself unstuck on your
current problem.&lt;/p&gt;

&lt;p&gt;However, asking good questions is hard. You need to take everything you’ve
tried and learned, word it in such a way that someone else can understand it,
and then finally figure out what you actually need to ask to get a helpful
answer. Doing all of this effortlessly requires not just communication skills,
but also serious empathy skills.&lt;/p&gt;

&lt;p&gt;What’s a good engineer to do here? Building up your communication and empathy
muscles can take a long time, and chances are you need answers to your questions
right. One option is to follow a fairly simple process I teach all my mentees in
order to jumpstart their own question asking skills.&lt;/p&gt;
&lt;p&gt;The process starts by doing your own research, transitions into defining your
problem appropriately, then sharing what you’ve already tried, and finally
actually asking a question. I’ve found that by following these four steps,
anyone can ask an informed question which puts them on the path to solving their
problems.&lt;/p&gt;

&lt;p&gt;So what are the specifics? Let’s jump into the details.&lt;/p&gt;

&lt;h3&gt;Step 0: Do your own research&lt;/h3&gt;

&lt;p&gt;Collaboration with other engineers is a great tool to help get you unblocked,
but remember that others have their own work they want to get done. Because of
this, you want to make sure that you’re valuing their time by doing your best to
solve your own issues before enlisting the help of others.&lt;/p&gt;

&lt;p&gt;Before you go out into the vast wilds of the internet to ask questions, make
sure that you’ve read through the relevant documentation, googled for your
question, and checked StackOverflow to see if anyone on the internet has already
solved your problem.&lt;/p&gt;
&lt;p&gt;Once you start going down the research rabbit hole, you may be nagged by the
question of “how do I know when I’ve done ‘enough research’”? To that end, I
like to follow the mantra of “You must try, then you must ask”, which states
that after you feel like you’ve hit a dead-end on a problem, you need to set a
timer, work on it for 15 more minutes, and then go ask for help.&lt;/p&gt;

&lt;p&gt;Once you’ve done you’ve tried and have not found a solution to your problem,
it’s time to go ask for help!&lt;/p&gt;

&lt;h3&gt;Step 1: Describe what you’re looking to accomplish.&lt;/h3&gt;

&lt;p&gt;The first step of asking a great question on IRC is actually not to ask any
question at all (very zen); the first step is to describe the problem you’re
trying to solve. You may be in a rush to get an answer to your specific
question, but remember, the person you’re asking has NO IDEA about the ultimate
goal you’re trying to accomplish.&lt;/p&gt;

&lt;p&gt;This can be the cause of a whole mess of frustration. If you just jump into a
channel and ask “How do I fix my failing Foobarnicator?”, someone’s first
response may be “Foobarnicators are so 2014, Baznicators are where it’s at now”.
Then before you know it you’re in a discussion about Foobarnicators vs.
Baznicators when you know Baznicators don’t solve your particular problem.&lt;/p&gt;

&lt;p&gt;In order to avoid this conundrum, you want to give the askee sufficient
context on the problem you’re trying to solve. “Sufficient Context” can be one
of those tricky shifting targets to hit: you don’t want to be too specific,
because then you don’t get to leverage your respondent’s domain knowledge to
validate your approach. However, you also don’t want to be too general, because
then your discussion can easily go off the rails.&lt;/p&gt;

&lt;p&gt;In general, I’ve found that there’s a goldilocks zone of specificity that
exists right around describing the human-facing goal that you’re trying to
achieve. Links to tasks in your bug tracker of choice are a great tool for this
(I’ll use JIRA just for example’s sake). For example:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;b&gt;Too Vague&lt;/b&gt;: Hey smart person! I’m looking to make some changes to our Android
    app.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Is probably too broad of a context to set. Android applications can be 100s
of thousands of lines of code, so anyone looking to help you is would be
throwing darts onto a board the size of Texas, hoping to get a bullseye.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;b&gt;Too Specific&lt;/b&gt;: Hey smart person! I’m looking to debug an error on line 56 on
    the PaymentActivity of our Android app.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This definitely gives people a much smaller idea of what context they need to
help you, but it also &lt;a href=&quot;https://www.sciencedaily.com/terms/anchoring.htm&quot;&gt;anchors&lt;/a&gt; them to a specific part of the code. If your
problem lies elsewhere in the code, both of you will need to take a step back to
find the actual solution to the problem.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;b&gt;Just Right&lt;/b&gt;: Hey smart person! I’m trying to add a feature to our
    application which lets us place orders ${JIRA TICKET}. When I send a request
    to place an order the app crashes!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This provides less detail than the above description, but it gives the person
you’re asking a framework for how to think about your problem without
pigeonholing them into a solution. Chances are they have a general idea of where
your problem may live, so it’s time to take the next step towards an answer.&lt;/p&gt;
&lt;h3&gt;Step 2: Describe relevant metadata and what you’ve tried so far&lt;/h3&gt;
&lt;p&gt;Once you’ve framed your question properly, the next thing you want to do is help your helper give you the best advice possible. This means not only explaining what you’ve tried so far, but also preemptively answering common questions that come up when people try to solve your particular problem. The pieces of information you should supply roughly break down into three categories:
&lt;p&gt;&lt;b&gt;1. Your investigation so far&lt;/b&gt;. Describe the areas of the code you’ve already explored, why those didn’t work out, and any conclusions that you’ve drawn from those failures. As you’re doing this, be sure to include the actual output of these actions. This can include things like:
&lt;ul&gt;
    &lt;li&gt;API responses&lt;/li&gt;
    &lt;li&gt;Stacktraces&lt;/li&gt;
    &lt;li&gt;Log lines that have been printed out&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;p&gt;&lt;b&gt;2. Actions you have taken to try to solve the problem.&lt;/b&gt; Have you run a clean build? Cleared your cache? Pulled master? Tried that thing your co-worker sent out in an email yesterday? If not, go do those first.
&lt;p&gt;&lt;b&gt;3. Any relevant metadata about your setup that may be important.&lt;/b&gt; The necessary information here can vary wildly depending on what you’re working on but the idea is you want to include details like your OS version and device model.
&lt;p&gt;If we were to fully contextualize our question above, it would look something like this.
&lt;p&gt;&lt;em&gt;Hey smart person! I’m trying to add a feature to our application which
    lets us place orders ${JIRA TICKET}. When I send a request to place an order
    the app crashes with a stracktrace of ${pastebin link}! I’ve found that
    after pressing the “order” button the application successfully sends a
    request to the server with that looks like ${pastebin link}, and receives
    the response ${pastebin link}. I’ve tried logging out and in and restarting
    the app but that doesn’t change the behavior . I’m also running Android M on
    a Google Pixel if that matters.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Holy cow! Our simple statement just became an intimidating block of text.
Even the most diligent assistant will have their eyes glaze over looking at
that. Eye-glazing is scientifically shown to lead to unhelpful results, so you
want to break this message up into multiple messages in quick success to make
the content easier to consume. After a quick trip to the line-break machine the
previous message becomes something like:&lt;/p&gt;
&lt;em&gt;&lt;p&gt;Hey smart person! I’m trying to add a feature to our application which lets
us place orders ${JIRA TICKET}. When I send a request to place an order the app
crashes with a stracktrace of ${pastebin link}!&lt;/p&gt;
&lt;p&gt;I’ve found that after pressing the “order” button the application
successfully sends a request to the server with that looks like ${pastebin
link}, and receives the response ${pastebin link}.&lt;/p&gt;
&lt;p&gt;I’ve tried logging out and in and restarting the app but that doesn’t change
the behavior. I’m also running Android M on a Google Pixel if that
matters.&lt;/p&gt;&lt;/em&gt;
&lt;p&gt;Oftentimes, you’ll find that completing this step forces you to think through your problem in a whole new way and gets you a solution to without actually needing to ask a question. However, if you’re still stumped it’s time to take on Step 3!
&lt;h3&gt;Step 3: Ask for help in a way that engages others but doesn’t abdicate
    responsibility.&lt;/h3&gt;
&lt;p&gt;Once you’ve established the problem you’re trying to solve and what you’ve
already tried, it’s time to actually ask for help! A good question has three
criteria:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;b&gt;Clarity&lt;/b&gt;: A good question will not leave any doubt what information
        you’re looking for from the person you’re asking.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;It actually solves your problem&lt;/b&gt;: If you are not able to
        accomplish your initial goal after getting an answer to your question,
        then you should head back to the drawing board and ask something that
        allows you to move forward.&lt;/li&gt;
    &lt;li&gt;&lt;b&gt;It keeps you in the drivers’ seat of problem solving&lt;/b&gt;: Most people
        are happy to help, but they don’t want to feel like others’ questions
        are being dumped on them. You want to ask a question which gets others
        to help you solve your own problem, not one which gets them to solve
        your problem for you.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fortunately for you, fair question asker, if you followed through on steps 1
and 2 of this process, you’ll have a pretty clear and actionable question to
ask. Oftentimes it will be some form of “Any idea where I should look next to
continue debugging this?” or “Does what I just described sound like a sane
approach to you?” Both of these are perfectly great questions and allow you to
push forward with solving your own problem&lt;/p&gt;

&lt;p&gt;Putting all this together, our final question ends up looking something
like:&lt;/p&gt;
&lt;em&gt;&lt;p&gt;Hey smart person! I’m trying to add a feature to our application which
    lets us place orders ${JIRA TICKET}. When I send a request to place an order
    the app crashes with a stracktrace of ${pastebin link}!&lt;/p&gt;
&lt;p&gt;I’ve found that after pressing the “order” button the application successfully sends a request to the server with that looks like ${pastebin link}, and receives the response ${pastebin link}.
&lt;p&gt;I’ve tried logging out and in and restarting the app but that doesn’t change
the behavior. I’m also running Android M on a Google Pixel if that matters.&lt;/p&gt;
&lt;p&gt;I’m kind of at a loss for where to chase this bug next, do you have any
suggestions for what I should investigate next?&lt;/p&gt;&lt;/em&gt;
&lt;p&gt;The above question hits all four of the major things you need. First, it
describes a problem that’s neither too specific nor too general, meaning that
whoever answers this question will be able to help us without being pigeonholed
into a possibly incorrect hypothesis. Next, it gave anyone who answers this
enough information about what you tried so they don’t have to spend time asking
questions like “have you tried restarting the app?” or “what’s the stack trace?”
and can focus on really understanding the problem. Lastly, it contains a
question which keeps you in the driver seat, ensuring that you’re consistently
collaborating rather than throwing your problems over a fence and hoping they
get solved.&lt;/p&gt;
&lt;p&gt;After you go through this process a bunch of times, you’ll find that you’ll
start to see patterns emerge in how others respond to your own questions, which
in turn allows you to ask better questions. This is GREAT, as it means that all
of your questions have led to your empathy muscles growing, which over time will
allow you to ask better questions and become a more well-rounded engineer.&lt;/p&gt;
&lt;p&gt;Of course, this process isn’t fool-proof, so you’ll occasionally find
yourself getting answers to questions which are different than what you really
need. When that happens, take a step back and make sure everyone involved
understands the problem you’re trying to solve and also what’s already been
explored. If that doesn’t get you where you want to go, fear not! The internet
is stuffed to the gills with great question asking resources. Specifically, I’m
a big fan of this post which speaks about some meta-question asking topics and
also links to some other fantastic resources.&lt;/p&gt;
&lt;p&gt;Happy question asking!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A big thank-you goes out to &lt;a
                         href=&quot;https://www.linkedin.com/in/or-weizman-557aa88&quot;&gt;Or&lt;/a&gt;
    and &lt;a href=&quot;https://twitter.com/ColtinC&quot;&gt;Coltin&lt;/a&gt;, two colleagues whose
    contributions significantly improved this post.&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Making The Most Of Your Internship Slides</title>
   <link href="http://maltzj.github.io/posts/waterloo-presentation"/>
   <updated>2016-09-17T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/waterloo-presentation</id>
   <content type="html">&lt;p&gt;Over the past weekend I had the pleasure of mentoring at Hack The North in
Waterloo, where I gave an updated presentation on how to have an awesome
internship/co-op.  The slides are live on Speakerdeck.&lt;/p&gt;

&lt;script async class=&quot;speakerdeck-embed&quot;
              data-id=&quot;dd84740a1afa4198bdf1b478a1342896&quot;
              data-ratio=&quot;1.77777777777778&quot;
              src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
</content>
 </entry>
 
 <entry>
   <title>Slides From How To Have An Awesome Summer Internship</title>
   <link href="http://maltzj.github.io/posts/stanford-presentation"/>
   <updated>2015-09-29T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/stanford-presentation</id>
   <content type="html">&lt;p&gt;Today I had the pleasure of giving a presentation to students at stanford about
how they can have a succesful summer internship.  These are the slides from that
presentation.&lt;/p&gt;

&lt;script async class=&quot;speakerdeck-embed&quot; data-id=&quot;235c7d2ebca246a18010c91625232ece&quot; data-ratio=&quot;1.77777777777778&quot; src=&quot;//speakerdeck.com/assets/embed.js&quot;&gt;&lt;/script&gt;
</content>
 </entry>
 
 <entry>
   <title>Some Tricks To Make You More Productive</title>
   <link href="http://maltzj.github.io/posts/some-tricks-to-make-you-more-productive"/>
   <updated>2014-06-23T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/some-tricks-to-make-you-more-productive</id>
   <content type="html">&lt;p&gt;Every developer has their own little kit of productivity tools  which they
constantly expand over time.  Unfortunately, I&apos;ve found that the only way these
tools get shared is when someone has a problem someone else pipes up &quot;Hey, I
know how to do that!&quot;, and passes on their tribal knowledge, only for it to be
lost until the next person has the same problem.  In the spirit of &quot;sharing
stuff I wish I&apos;d known last year&quot;, I wanted to share some neat things I&apos;ve
discovered over the past couple of months which have helped me solve various
problems.&lt;/p&gt;

&lt;p&gt;Before getting started, I deliberately haven&apos;t gone into the nitty gritty of how
this stuff works/is configured.  Once you know that most of this stuff exists,
actually configuring it is pretty easy.&lt;/p&gt;

&lt;h3&gt;Git&apos;s -w flag&lt;/h3&gt;

&lt;p&gt;Ever found yourself looking at a git diff and seen hundreds of lines of changes
which were only whitespace?  Did your team&apos;s recent switch from tabs to spaces
make git blame useless?  If so, it&apos;s -w flag to the rescue!&lt;/p&gt;

&lt;p&gt;When using git blame, git show, or git diff (and possibly more), the -w flag
will ignore whitespace changes, making it easy to find the proper person to yell
at for the bug they introduced.&lt;/p&gt;

&lt;h3&gt;Git log -G&lt;/h3&gt;

&lt;p&gt;Sometimes you find yourself looking at a file that seems to have undergone all
sorts of wacky transformations such that just using git blame/show doesn&apos;t tell the
full story. What you really need is a full history of that file so you can trace
the commits.  In these cases, git log -G is what you&apos;re looking for.&lt;/p&gt;

&lt;p&gt;This command will look through all of the diffs of your commits, and only return
those that have a particular string in them.  You can use this to look for
particular symbols that were modified, or you can just look for file names, as
those are also included in diffs.  Searching for file names is especially nice
because you don&apos;t need to put the fully qualified path of the file you want,
just the base name will do.&lt;/p&gt;

&lt;p&gt;There are also more tools to look through your commit history which give you
more fine-grained control over how you search.  These two flags are -S and
--grep, and the difference between these are summed up nicely in &lt;a
href=&quot;http://stackoverflow.com/questions/1337320/how-to-grep-git-commits-for-a-certain-word/1340245#1340245&quot;&gt;this
StackOverflow comment&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Configuring /etc/hosts for maximum productivity&lt;/h3&gt;

&lt;p&gt;If you&apos;ve done any web development, you&apos;re definitely used to configuring
virtual hosts by editing your /etc/hosts file.  Over the past couple of months
though I&apos;ve started using it for an additional purpose: keeping myself focused.  In
addition to all of my virtual hosts, I have also re-routed Twitter, Facebook,
and Reddit all to localhost.&lt;/p&gt;

&lt;p&gt;Before doing this I&apos;d often find myself checking Reddit &quot;just for a minute&quot; and
then 30 minutes later I&apos;d be way off track, looking at a bunch of mediocre cat
memes. Now, if I want to get on Reddit or Facebook, I need to take a couple of
conscious steps to edit my /etc/hosts file and unblock that website.&lt;/p&gt;

&lt;p&gt;It isn&apos;t too much of a hassle, so I can still easily test stuff like
Facebook/Twitter sharing, but it&apos;s enough friction that I don&apos;t find myself
aimlessly wandering to my twitter feed.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; this also works really well if you need to study for finals and find
yourself constantly distracted by Tetris Friends a la Gerard O&apos;Neill.&lt;/p&gt;

&lt;h3&gt;Pycharm Remote Debugging&lt;/h3&gt;

&lt;p&gt;Over at Yelp, all of our API development is done on remote machines. While this
solves some infrastructure problems, it also creates some others. One of the
biggest, especially for API developers is &quot;how the hell do you debug stuff?&quot;  Printing is one option,
but sometimes you need something more powerful, and that&apos;s where Pycharm remote
debugging comes in.&lt;/p&gt;

&lt;p&gt;With remote debugging you can insert a couple of lines of code into any file, drop
in a breakpoint, and then run my code as normal.  Whenever that breakpoint gets
hit, the remote code will connect to my local Pycharm instance, and connect to
the debugger as if the code was running locally.&lt;/p&gt;

&lt;p&gt;Once connected, you can debug the code as if it were running locally.  You can
step into method calls, examine program state, and drop in further breakpoints
just as if your code were running locally.  If you&apos;re used to visual debuggers
from other IDEs this is truly a god-send.&lt;/p&gt;

&lt;h3&gt;IntelliJ Live Templates&lt;/h3&gt;

&lt;p&gt;No matter what language you write in, there are always code blocks that you find
yourself continually writing.  IntelliJ live templates are the end of this.
With live templates, you cobble together a bunch of code that you are
continually writing (e.g. the 3-line code block which sets up Pycharm remote
debugging) and assign it to a shorthand notation.&lt;/p&gt;

&lt;p&gt;Next, when you want to drop that particular code block somewhere, you can call
up your list of live templates, start typing out your template&apos;s assigned name
and then get it completed as if it were just another function name.&lt;/p&gt;

&lt;p&gt;But wait! In case adding 5-lines of code with 4 keystrokes wasn&apos;t enough, you
can also customize live templates so that parts of them are variable.  This is
incredibly useful if you often write something like Log.e(TAG,
&quot;random_debug_statement&quot;).&lt;/p&gt;

&lt;p&gt;By using live templates, you can assign that whole statement to one live
template, called LE.  Then, when you insert the LE template, your cursor will be
put right in the quotes where you&apos;d write your debug statement. You can also go
crazy and have live templates with multiple variables and just tab through to
insert text where appropriate.  You have never felt like such a master of your
code.&lt;/p&gt;

&lt;p&gt;Those are all the neat little tricks I&apos;ve picked up for now. Over the next
couple of weeks I&apos;ll (finally) be digging into Android Studio and Espresso for
HN, so hopefully that will lead to all sorts of productivity goodness in the
wake of my first Google I/O.&lt;/p&gt; 
</content>
 </entry>
 
 <entry>
   <title>How To Have An Awesome Summer Internship</title>
   <link href="http://maltzj.github.io/posts/how-to-have-an-awesome-summer-internship"/>
   <updated>2014-05-09T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/how-to-have-an-awesome-summer-internship</id>
   <content type="html">&lt;IMG SRC=&quot;/images/internship-talk/slide-1.png&quot; NAME=&quot;graphics1&quot;&gt;

&lt;P&gt;Last week I gave a talk at Rutgers about how to make the most out
of your summer internship. Over the past few years I&apos;ve worked at a
fair variety of companies, and I&apos;ve screwed up a lot in the process.
Before heading out into the world of a full-time engineer I wanted to
codify some of the lessons that I&apos;ve learned in hopes that future
interns will be able to avoid some of the pitfalls I ran into.&lt;/P&gt;
&lt;IMG SRC=&quot;/images/internship-talk/slide-2.png&quot; NAME=&quot;graphics2&quot; /&gt;
&lt;P&gt;In case you randomly stumbled here and have no idea who I am: Hi!
I&apos;m Jonathan. I&apos;m a recent Rutgers grad who now works as an Android
engineer at Yelp. When I&apos;m not doing that, I help make a Hacker News
reader called HN and occasionally fix up stuff in the Github app. I
also stay tuned into Rutgers by helping admin the Rutgers Hackathon
Club, a Facebook group where students and alumni hang out.&lt;/P&gt;
&lt;IMG SRC=&quot;/images/internship-talk/slide-3.png&quot; NAME=&quot;graphics3&quot; /&gt;

&lt;P&gt;Before getting started, I want to save people&apos;s time by mentioning
a couple things that I won&apos;t be talking about in these slides. For
one, I won&apos;t be talking about how to land your dream internship. The
reason for that is simple: I don&apos;t know how to land your dream
internship.&lt;/P&gt;
&lt;P&gt;My strategy for getting an internship was to get really good
grades and then apply everywhere that would have me. That turned out
pretty well for me, but from what I understand that&apos;s not The Right
Way to get your dream internship.  Sadly, I can&apos;t speak to The Right
Way, but a bunch of other people have written some awesome stuff
about it.  Check that out at the links above.&lt;/P&gt;
&lt;P&gt;The other thing I won&apos;t be talking about is how to land a
full-time offer after your internship, mostly because I think that&apos;s
a misguided goal for the summer. Spending your summer focused on
getting a full-time offer is putting the horse before the carriage in
my mind. Instead, spend your summer focusing on how to improve your
skills as a developer and then let good things follow. If you&apos;re
curious about how to land a full-time offer, ask your recruiter about
it, they&apos;ll be a way better resource than me anyway.&lt;/P&gt;
&lt;IMG SRC=&quot;/images/internship-talk/slide-4.png&quot; NAME=&quot;graphics4&quot; /&gt;

&lt;P&gt;Cool, now that that&apos;s out of the way, time to get into some of the
stuff that I will be talking about (the stuff that those puppies are
really excited about).&lt;/P&gt;
&lt;P&gt;2/3 of what I&apos;ll be talking about is inside the workplace stuff:
what to expect, what you&apos;ll be learning, what to look out for, and
how to make the most out of your time as an intern. The other third
is stuff that I screwed up and how to avoid that yourself.&lt;/P&gt;
&lt;IMG SRC=&quot;/images/internship-talk/slide-5.png&quot; NAME=&quot;graphics5&quot; /&gt;

&lt;P&gt;With that in mind, I suppose it makes sense to define what exactly
makes an awesome internship. For me, the answer to that question is
two-fold.&lt;/P&gt;
&lt;P&gt;First and foremost, an awesome internship will set you up for a
successful career over the long-term. Your first experience as a
full-time developer can feel like an overwhelmingly important
experience, but in the grand scheme of things it&apos;s just one small
time slice of a much larger career.&lt;/P&gt;
&lt;P&gt;Instead of treating your internship as a make or break moment for
your career, look it as another opportunity to improve your craft.
Focus on soaking up all the knowledge you can from your teammates and
your environment. That way, when you get out of college you&apos;ll be
able to make a solid decision about where to work full-time.&lt;/P&gt;
&lt;P&gt;At the same time, an internship experience be super serious all
the time (or arguably ever). During your summer You&apos;ll probably be
getting paid heaps of money to run around an exciting city, possibly
with support from your employer (if they have an official intern
program set up). Having an awesome internship is just as much about
experiencing the best parts of your temporary home as it is
professional development.&lt;/P&gt;
&lt;IMG SRC=&quot;/images/internship-talk/slide-6.png&quot; NAME=&quot;graphics6&quot;/&gt;

&lt;P&gt;Before you get started interning, one thing to realize is that
many times during your summer you may feel like a dumb person in a
room full of experts. THAT&apos;S OKAY. In fact, that&apos;s not only okay,
it&apos;s expected.&lt;/P&gt;
&lt;P&gt;You&apos;re probably be put onto a team with a bunch of people who have
5+ years cutting code for a living. It would be ridiculous to expect
that you&apos;d rock up and be coding at their level after a month of
experience professionally creating software.&lt;/P&gt;
&lt;P&gt;You weren&apos;t hired with the expectation that you&apos;ll put out the
same quantity and quality of code as experienced engineers. Rather,
you were hired with the expectation that you&apos;ll struggle a bit and do
some bumbling around before figuring out how things work.&lt;/P&gt;
&lt;P&gt;So don&apos;t feel bad when you have to ask &amp;quot;how do I submit my
code for review&amp;quot;, or if it subsequently gets shredded on review.
Those types of struggles are TOTALLY NORMAL and are part of the
growing process. Even the superhuman senior architect on your team
was once there too.&lt;/P&gt;
&lt;IMG SRC=&quot;/images/internship-talk/slide-7.png&quot; NAME=&quot;graphics7&quot; /&gt;

&lt;P&gt;Although you aren&apos;t expected to have flawless development skills,
you will want to take the opportunity to improve as much as possible
and learn as much as possible about how to become a better developer.&lt;/P&gt;
&lt;IMG SRC=&quot;/images/internship-talk/slide-8.png&quot; NAME=&quot;graphics8&quot; /&gt;

&lt;P&gt;The first half of improving your skills as a developer is
increasing your knowledge of all the technical stuff that goes into
making software. A lot of this will happen organically just because
you&apos;ll be reading, writing, and getting feedback on lots of code.
However, you can also take a couple of steps to supercharge your
learning.&lt;/P&gt;
&lt;P&gt;First: actually read documentation. By read documentation I don&apos;t
mean &amp;quot;open up the docs and press CTRL+F&amp;quot;. That&apos;s not
reading documentation, that&apos;s playing the blind squirrel hoping to
find a nut. I mean actually take the time to sit down and read them
until you fully understand them.&lt;/P&gt;
&lt;P&gt;It may feel weird and unproductive and weird to spend a full day
reading docs. Again, DON&apos;T WORRY, spending 6 hours just reading docs
is TOTALLY NORMAL; hell, it&apos;s sometimes what you need to do to get
your job done. Remember, you aren&apos;t expected to know everything when
you get there, so the only way you&apos;re going to learn stuff is to
read.&lt;/P&gt;
&lt;P&gt;Secondly: use your mentor to get you unstuck on problems. Chances
are you will have a mentor assigned to you, try to figure stuff out
on your own, but when you&apos;re stuck, ask him or her where to look
next.&lt;/P&gt;
&lt;P&gt;At the same time, it can be a little bit of a guessing game when
to ask your mentor for help and when to dig a little deeper. My
general rule is to follow the method outlined in &lt;A HREF=&quot;https://blogs.akamai.com/2013/10/you-must-try-and-then-you-must-ask.html&quot;&gt;this
blog post&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;There&apos;s also the possibility that you won&apos;t have a mentor assigned
to you, if that&apos;s the case just grab a friendly full-timer and ask
them your question. Again, remember that asking questions doesn&apos;t
make you any less of a developer, we all need help sometimes.&lt;/P&gt;
&lt;P&gt;Third: ask your mentor big picture questions that will help you
better understand how to develop large-scale systems. These are
questions like &amp;quot;how is our X designed? Why is it designed that
way? What are some limitations of that?&amp;quot;&lt;/P&gt;
&lt;P&gt;One awesome strategy my friend Vaibhav uses to find these
questions is to write down any term he hears that he doesn&apos;t
understand down in a notebook. Then, once or twice a week he&apos;d have
lunch with his mentor and just pepper him with questions about his
company&apos;s technology. Steal that or come up with your own strategy,
but whatever you do, figure out a way to learn about software
engineering from someone who has been doing it already.&lt;/P&gt;
&lt;IMG SRC=&quot;/images/internship-talk/slide-9.png&quot; NAME=&quot;graphics9&quot; /&gt;

&lt;P&gt;The second class of things to learn during your internship is how
you can improve your own tools and workflows.&lt;/P&gt;
&lt;P&gt;During the course of your internship, you&apos;re going to run into a
lot of people who do things differently than you. Constantly be on
the lookout for these differences, and try to figure out how to steal
the good stuff for your own workflow.&lt;/P&gt;
&lt;P&gt;As a rule, if you see someone with something that looks useful,
whether it&apos;s a cute keyboard shortcut or a random productivity tool,
you should ask them what they&apos;re using and how it helps them work
better. If their method seems like it would solve a problem that
you&apos;re having, head back to your desk and make a note to try it out.&lt;/P&gt;
&lt;P&gt;Don&apos;t let this list languish. Block out time every week to improve
your own workflows. This time may be spent solving some of your own
pain points or it may be figuring out how to use the new hotness that
your mentor showed you last week. It may seem like a waste to not
spend every hour working on your intern project, but any investment
in your productivity now will pay big dividends over the long haul.&lt;/P&gt;
&lt;P&gt;The other thing to be on the look-out for are the soft skills that
other developers posses. You&apos;ll undoubtedly run into people who are
awesome communicators and problem solvers. Many people who are great
at these two skills have systems or tricks that they use to be great.
If you find yourself impressed with how someone communicates, see if
you can recognize those systems and incorporate them yourself.&lt;/P&gt;
&lt;IMG SRC=&quot;/images/internship-talk/slide-10.png&quot; NAME=&quot;graphics10&quot; /&gt;

&lt;P&gt;The technical side of things is really only part of what you can
learn and get out of your internship. There is also a wealth of
non-technical things that you can pick up during your summer which
will serve you well.&lt;/P&gt;
&lt;IMG SRC=&quot;/images/internship-talk/slide-11.png&quot; NAME=&quot;graphics11&quot; /&gt;

&lt;P&gt;Once of the biggest things I screwed up during my first two
internships was being asocial. I would show up to work, eat lunch at
my desk, and then head home every day with barely a peep to my
coworkers. Both times this turned out to be a terrible decision, as
it resulted in me being burned out and dreading work by the end of my
internship.&lt;/P&gt;
&lt;P&gt;At Yelp!, I decided to flip the script and actually take some time
away from my desk. I joked around with my teammates, played foosball
with other interns, and staunchly refused to eat lunch at my desk,
even if it meant eating by myself at 3 PM in the park.&lt;/P&gt;
&lt;P&gt;The difference was massive. Every day I felt like I had energy to
solve problems, and when I started to feel down I could always find
someone who could help give my mind a break. Most importantly, I
never woke up dreading going into Yelp, which was a huge boost for
both my happiness and my productivity.&lt;/P&gt;
&lt;P&gt;It can be tempting to spend your entire summer with a laser like
focus on your terminal (especially if you&apos;re focused on getting a FT
offer), but trust me, DON&apos;T DO IT. Not only should be a FT offer not
be the focus of your internship, but also you&apos;ll be happier and more
productive if you step away from the computer every now and again.&lt;/P&gt;
&lt;IMG SRC=&quot;/images/internship-talk/slide-12.png&quot; NAME=&quot;graphics12&quot; /&gt;

&lt;P&gt;Besides learning to take breaks, the most important non-technical
thing you can learn during your internship is what matters to you in
a company culture. It&apos;s easy to think of this as &amp;quot;is a company
filled with cool people?&amp;quot;, but there&apos;s so much more to it than
that.&lt;/P&gt;
&lt;P&gt;Culture is questions like &amp;quot;is this environment comfortable
for me?&amp;quot;, &amp;quot;if I feel uncomfortable, do I have an avenue to
fix that?&amp;quot;, &amp;quot;am I cool when/where/the amount I&apos;m expected
to work?”, and many more. One of the best articles I&apos;ve read on
this subject is &lt;A HREF=&quot;https://medium.com/p/4bbf84c55dbf&quot;&gt;Where To
Work&lt;/A&gt;, which gives a great breakdown of the types of cultural
values that are universally important.&lt;/P&gt;
&lt;P&gt;If your company hits high notes on those types of big picture
questions, then you&apos;ll have a good time working there even if it
isn&apos;t filled with your BFFs. However, if you&apos;re working with a bunch
of &amp;quot;cool people&amp;quot; with unsatisfactory answers to these
questions, then it may not turn out well over the long haul.&lt;/P&gt;
&lt;P&gt;Whether or not your summer is spent working with cool people, be
on the look-out for whether you&apos;re working somewhere that has a
culture that you fit with. Understand what it means to fit somewhere
vs. not fit somewhere, and figure out what questions you can ask of
future opportunities to figure out where you&apos;d fit.&lt;/P&gt;
&lt;IMG SRC=&quot;/images/internship-talk/slide-13.png&quot; NAME=&quot;graphics13&quot; /&gt;

&lt;P&gt;Internet blogs are riddled with stories of people who tried to be
a 10x engineers and ended up a shell of their former selves. DON&apos;T
LET THAT BE YOU THIS SUMMER.&lt;/P&gt;
&lt;P&gt;It can be tempting to fall into the trap of &amp;quot;I need to work
all the hours to get a full-time offer.&amp;quot; If you find yourself
thinking this way, ask yourself: If you had to work this much for two
years, would you still be happy? If not, then you probably don&apos;t want
that full-time offer anyway, so killing yourself isn&apos;t doing much for
you.&lt;/P&gt;
&lt;P&gt;There is no magic formula for working sustainably, but as a
general rule, you should be trying to work at a pace where you feel
like you&apos;re able to focus throughout the day. If you find yourself
sporting any of the signs in &lt;A HREF=&quot;http://www.mayoclinic.org/healthy-living/adult-health/in-depth/burnout/art-20046642&quot;&gt;this
article&lt;/A&gt; it may be time to scale back the number of hours you&apos;re
working.&lt;/P&gt;
&lt;IMG SRC=&quot;/images/internship-talk/slide-14.png&quot; NAME=&quot;graphics14&quot; /&gt;

&lt;P&gt;Every few months a post appears in /r/AskReddit basically asking
&amp;quot;how the hell do I make friends after college?&amp;quot; This
question seems silly if you&apos;re used to a university setting filled
with casual interactions, but it highlights the fact that making
friends out of school can be non-trivial, especially if you&apos;re
starting from scratch.&lt;/P&gt;
&lt;P&gt;If you&apos;re interning in a city where you have a bunch of friends
from college then this probably isn&apos;t much of a problem. However, if
you&apos;re taking an opportunity where you don&apos;t know anyone within 50
miles, you&apos;re going to have a bit more of a challenge.&lt;/P&gt;
&lt;P&gt;Put yourself out there by organizing/attending events with other
interns (most companies will have an interns chat room or mailing
list, go hang out there.  If one doesn&apos;t exist, create it). If you&apos;re
a solo bandito intern at your companies, find local groups that do
stuff that you&apos;re interested in and start regularly attending those
events.&lt;/P&gt;
&lt;P&gt;Whatever you do, don&apos;t let your summer be characterized by you
sitting around in your apartment by yourself. Not only is this a
bummer of a way to spend a summer, but your mental health will suffer
pretty badly in the process.&lt;/P&gt;
&lt;IMG SRC=&quot;/images/internship-talk/slide-15.png&quot; NAME=&quot;graphics15&quot; /&gt;

&lt;P&gt;So yeah, that&apos;s pretty much all my thoughts on internship. I&apos;m
sure that I could write another couple hundred words, but most of
your eyes have probably glazed over by now, so that wouldn&apos;t do much
good.&lt;/P&gt;
&lt;P&gt;If you have any questions about anything I wrote here, or you just
want to tell me that what I wrote was good/misguided/so terrible you
can&apos;t believe they let me on the Internet, feel free to contact me at
one of the links in the second slide. Also, I&apos;ll be organizing a
couple things with Rutgers Hackathon Club peeps over the summer, so
if you want to get in on that let me know.&lt;/P&gt;
</content>
 </entry>
 
 <entry>
   <title>The Price of Inconsistent Code</title>
   <link href="http://maltzj.github.io/posts/the-price-of-inconsistent-code"/>
   <updated>2013-12-05T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/the-price-of-inconsistent-code</id>
   <content type="html">&lt;p&gt;have You ever read an english essay so riddled with errors its tough to read.
i&apos;m not talking your normal run of the mill errors; I&apos;m talking about
really systematic misunderstanding of how to use punctation!&lt;/p&gt;

&lt;p&gt;If so, and you&apos;re reading this blog, then it probably evokes the same 
emotions as seeing code that looks something like this.&lt;/p&gt;
&lt;code&gt;
	&lt;pre&gt;
	public int foo_barnicate (int foo, float bar ){
		if (  foo &gt;= 0  ) 
			int baz = bar+foo;
		
		return baz;
	}

	public String barFoonicate(String herp)
	{
		if(herp.isEmpty()) herp+= &quot; derp&quot;;

		return herp;
	}
	&lt;/pre&gt;
&lt;/code&gt;

&lt;p&gt;In addition to inspiring blood boiling rage, hopefully both of these
examples imposed the same type of cognitive tax on you.  You probably found
yourself struggling just a little bit to place commas in their proper place,
relocate brackets, and make sure that all the whitespace was properly aligned.
In short, you were spending energy trying to impose consistency between your
mental model of what the text should look like, and what it did look like.&lt;/p&gt;

&lt;p&gt;We normally don&apos;t think about this idea of consistency when dealing with English.
Instead, we think about &quot;English grammar&quot;, which are really just a set of
rules that English speakers agree on about what makes a proper
sentence. This agreement is super helpful, because it means that everyone who is
writing or reading English has the same mental model of what the text should
look like.  Whenever a writer writes English, he or she only needs to follow
these rules and anyone who reads English will be able to quickly understand the
structure of the text, allowing readers to focus most of their energy on
understanding the text&apos;s content.&lt;/p&gt;

&lt;p&gt;Unfortunately, the programming gods have not been so kind to software
developers.  Rather of having a well defined set of conventions for punctuation
and structure, our languages have structural conventions ranging from the
whitespace enforcement of Python to many languages&apos; atitude of &quot;format however
you want, I don&apos;t care&quot;.  Many developers have realized this lack of standards
leads to readability problems, so they set out to fix it by creating style
guides like PSR and PEP-8, and even going so far as to create a language with a
built-in formatter (in the case of Go).&lt;/p&gt;

&lt;p&gt;All of these tools have been boons for developers who want to read and write
consistent code, but they don&apos;t solve the fact that developers can ignore every
possible guideline and still write correct code.  This creates a problem, as it
means that every block of code presents the author with a new opportunity to use
a new style and break the reader&apos;s mental model of how the code should look.
When this happens, and code switches between styles at will, programmers reading
code don&apos;t have the luxury of being able to focus on the substance of the code
that they&apos;re reading. Instead, they first need to waste energy mentally
reshaping the code to a consistent image of how it should look, and only then can they
start worrying about understanding its content.  What&apos;s more, if the
inconsistency continues into naming conventions, programmers extending code need
they will need to waste even more time hunting down whether they need to call
fooBarnicate(), foo_barnicate(), or foobarnicate().&lt;/p&gt;

&lt;p&gt;The thing is, avoiding problems like these isn&apos;t all that hard, it just requires
getting into the habit of writing consistent code. Once you have internalized
the idea that consistency is important, all you need to do in order to edit any
file is find out &quot;how does this file format {insert code feature here}&quot;, and
then write their own code in the same manner.  No style guide needed!.&lt;/p&gt;

&lt;p&gt;Sadly though, if Rutgers is any indication, consistency is simply not part of a
CS education; code readability is only covered by briefly mentioning the
importance of variable naming and comments.  From there, code quality is ignored
until jumping to OO-Design, where high level documentation is also briefly
touched on.&lt;/p&gt;

&lt;p&gt;While these concepts are definitely important, it&apos;s a little bit like teaching
students vocabulary, saying &quot;hey spelling and punctuation exist&quot; and then
jumping to how to write a full essay.  Sure, you&apos;ve given them all the tools to
write down their ideas in a well structured essay, but chances are it will give
any English teacher a heart attack.  Similarly, understanding programming
without a mind for consistency leads to people creating code that may be
conceptually well structured, but it is unecessarily difficult to read.&lt;/p&gt;

&lt;p&gt;This type of code is fine in a classroom environment, where it can be written
and thrown away after 48 hours. However, in a team environment, code doesn&apos;t
just get thrown away, it needs to stay around and be maintained for a (sometimes
long) period of time.  What this means is that over time, the amount of code
that exists will start to build up, and re-writing it to fit one consistent
style will start to take more effort, until it becomes impossible without
automated tools.  If you don&apos;t enforce a constistent code style from the
start, when the time comes to do maintence, anyone reading your code will
first need to spend extra time just wrapping their head around how it looks
before actually implementing new features.&lt;/p&gt;

&lt;p&gt;So do your future maintainers a favor, and take a couple seconds to minimize
code inconsistency while you write.  Who knows, your future maintainer could
just be you.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>From 0-350 In Three Years</title>
   <link href="http://maltzj.github.io/posts/zero-to-350"/>
   <updated>2013-11-08T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/zero-to-350</id>
   <content type="html">&lt;p&gt;Back when I first declared my CS major at Rutgers three years ago, the community
was a far cry from the vibrant and passionate one that characterizes Rutgers
today. When I started, Rutgers computer science was a disparate collection of
students who scarcely got together in groups larger than four people.&lt;/p&gt;

&lt;p&gt;Since then, the community has grown by leaps and bounds; its members have
launched startups, taken second in the inaugural MLH season, and founded both a
semi-annual hackathon and a semi-annual tech meetup. Now that I have 1.5 feet
out the door at Rutgers, I wanted to take a look what factors came together
these past three years to change Rutgers CS from a scattered community to the
massive group of developers it is today. In the process, I hope that our success
can provide some ideas for people hoping to create a similar culture at their
school.&lt;/p&gt;

&lt;h2&gt;We got a physical space for students to socialize in&lt;/h2&gt;

&lt;p&gt;When you hear “campus computer labs”, it generally conjures up unappealing
images like this:&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/uglycslab.jpeg&quot; /&gt;&lt;/center&gt;

&lt;p&gt;Although there is a fair amount of that at Rutgers, one of our labs is quite
different. A few years back a Rutgers employee named Lars Sorrenson decided to
convert one of our CS labs into a collaborative learning space. The result was
the CAVE, a CS lab which looks something like this:&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/cavelab.jpeg&quot; /&gt;&lt;/center&gt;

&lt;p&gt;Although the CAVE isn’t exactly a productive work environment, its design has
made the room a CS community hub at Rutgers. The CAVE serves as a great place
for workshops and tutoring, but its most important role is as a place for
students to meet and hangout between classes. Sometimes they’ll discuss
programming, but other times they will just play video games or watch the latest
Game of Thrones episode on the giant TV. Through it all, familiar faces from
class become acquaintances, acquaintances become friends, and those friendships
form the basis for a strong community of developers at Rutgers.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;What any university can do&lt;/b&gt;: Create a comfortable physical space for students to
hang out in and get to know each other. If you can convert an old computer lab,
that’s great; if not, try looking for other options to get people in the same
space together.&lt;/p&gt;

&lt;h2&gt;HackRU was started and held regularly&lt;/h2&gt;

&lt;p&gt;Although now there are a fair number of Rutgers students who regularly travel to
hackathons, three years ago you would have been pressed to find more than a
handful who even knew what a hackathon was. HackRU initially started out as a
modest attempt to grow this small handful, but since then it has grown to engage
250+ students every semester. In the process, it has helped hugely in building
community by bringing hacker culture to students at Rutgers.&lt;/p&gt;

&lt;p&gt;As the attendance at HackRU demonstrates, there is a large group of students who
are either too busy, too intimidated, or simply unaware of hackathons that are
going on around the country. By creating an on-campus hackathon, the organizers
of HackRU have been able to bring these students together and get them excited
about building projects in a way that didn’t happen before. This is not only
awesome because it grows the skills of young developers, but also because it
shows all the attendees that they’re a part of a larger Rutgers developer
community.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;What any university can do&lt;/b&gt;: Throw a hackathon at your school, no matter where
you are. Start by targeting just students at your university and then grow it
from there. If you don’t think it’s worthwhile, &lt;a
	href=&quot;https://medium.com/hackers-and-hacking/96467ee9a9b8&quot;&gt;have a look&lt;/a&gt; at what a HackMIT

organizer had to say about her experiences.&lt;/p&gt;

&lt;h2&gt;We created culture based on learning and positivity&lt;/h2&gt;

&lt;p&gt;Tess Rinearson wrote &lt;a
	href=&quot;https://medium.com/tales-from-the-front/b23f997455fa&quot;&gt;an awesome
	article&lt;/a&gt; a while back about how CS
is a community that is focused on building each other up, and we’ve tried to
make that very evident at Rutgers. As many community leaders have grown and
become more skilled, they have started to focus on helping underclassmen improve
their skills and encouraging them to work on side projects.&lt;/p&gt;

&lt;p&gt;From their very first CS course, students are introduced to the idea that
Rutgers CS is a helpful community of students by the peer mentoring program.
Through this, upperclassmen are put in charge of running small recitations for
CS 111, our Intro to CS course at Rutgers. In addition to helping take some of
the load off department TAs and establishing a precedent of helpfulness, the
peer leader program has served as a great way for upperclassmen to bring
underclassmen into the CS community without them having to attend events.&lt;/p&gt;

&lt;p&gt;Over the past three years, the spirit of that program has been taken up and
broadened by a couple of on campus organizations dedicated to helping students
build their programming skills outside the classroom. One such organization,
RUMAD has done this by helping students build mobile applications, a process
which includes hands-on workshops and presentations about the latest technology.
Another organization called USACS has been offering mentoring, tutoring
sessions, and a weekly Hacker Hour series to teach students about topics they
wouldn’t learn in class. At the same time, RU Tech Meetup and the Rutgers
Hackathon Club have also sprung up as avenues for students to get together and
show off what they built, thus furthering the idea that students can, and
should, get together to build projects on their own.&lt;/p&gt;

&lt;p&gt;Taken together, these efforts haven’t produced a development utopia at Rutgers,
but they have produced a community of students who are eager to grow their
skills and help others do the same.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;What any university can do&lt;/b&gt;: Create mentorship programs to encourage young
developers and help them feel comfortable. Also, create opportunities where
people can be recognized for their hard work.&lt;/p&gt;

&lt;h2&gt;Leaders stepped up and built organizations which brought people
	together&lt;/h2&gt;

&lt;p&gt;One of the biggest problems that faced the Rutgers technology community when I
joined was that it lacked leaders who took the initiative in building it. All
that has changed over the last 3 years as a handful of leaders have emerged to
drive the community to its current state.&lt;/p&gt;

&lt;p&gt;The proto-leaders in this sense were V and Sameen, two of the big architects
behind HackRU, but they aren’t the only ones. Since HackRU 1, many leaders have
stepped up and left a legacy of building community at Rutgers. On the USACS
side, after V and Sameen stepped down, Devon served as president and brought his
own brand of creativity to the table, and now Billy Lynch is doing the same with
his presidency at USACS.&lt;/p&gt;

&lt;p&gt;At the same time, leadership has expanded past USACS in the form of Swift, who has set the gold standard helping Rutgers students even
after graduation, and the RUMAD team: Nis, Dave, and co., all of whom have taken
RUMAD from nothing to a 200+ person club in just two years. Without the
contributions of these and many other leaders, it is tough to say what the
Rutgers community would look like today. However, what’s for sure is that
because of these students’ hard-work in building events and organizations,
Rutgers technologists have been able to come together in a way that was unheard
of 3 years ago.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;What any university can do&lt;/b&gt;: If you feel like your school needs to have a larger
community, start planning events you’d want to attend and then market the hell
out of them. Communities don’t just magically appear from thin air, it takes
people to build them.&lt;/p&gt;

&lt;p&gt;Looking back at the past three years, it’s pretty amazing to see what how much
the CS culture at Rutgers has grown. While we haven’t built a development
paradise, we have taken a community of 10 students and transformed into a group
of 350+ developers who are energized about building new projects. Sadly my time
as a Rutgers CS undergrad is coming to an end, so I won’t be able to shape the
future of the undergrad community anymore. Nonetheless, I’ll be back as an
alumnus over the coming years, and I’m excited to see how future students find
ways to grow the Rutgers developer community even further.&lt;/p&gt;

&lt;em&gt;This initially appeared&lt;a
		href=&quot;https://medium.com/career-pathing/9b03718d32b9&quot;&gt;on Medium&lt;/a&gt;&lt;/em&gt;

</content>
 </entry>
 
 <entry>
   <title>Getting The Most out of your First Hackathon</title>
   <link href="http://maltzj.github.io/posts/getting-the-most-out-of-hackathons"/>
   <updated>2013-10-07T00:00:00+00:00</updated>
   <id>http://maltzj.github.io/posts/getting-the-most-out-of-hackathons</id>
   <content type="html">&lt;p&gt;It&amp;rsquo;s no secret that over the past three years hackathons have exploded
across the country, bringing with them the opportunity for thousands of students
to grow their coding skills and build a community of developers at their
university.  Despite this massive growth, it seems that hackathon knowledge is
still spread by word of mouth, leaving some younger students wondering how to
get started.&lt;/p&gt;

&lt;p&gt;Every couple of months a new student will pop into our Rutgers Hackathon Club
Facebook group and ask &amp;ldquo;I&amp;rsquo;m only a freshman, can I still join and be
successful?&amp;rdquo; (&lt;em&gt;yes, you can&lt;/em&gt;), &amp;ldquo;I only know [INTRO TO CS
LANGUAGE], can I still make something?&amp;rdquo; (&lt;em&gt;yes, you can&lt;/em&gt;) or
&amp;ldquo;how do I know what project to work on while I&amp;rsquo;m there?&amp;rdquo;
(&lt;em&gt;more on that later&lt;/em&gt;).  Although much of this is tribal knowledge
among veterans, no one has taken the time to codify how newcomers get the most
out of their experience.  To that end, I&amp;rsquo;ve put together a dead simple
list of everything a first time attendee needs to do so as to maximize their
initial hackathon.&lt;/p&gt;

&lt;h4&gt;Read up a little bit (optional)&lt;/h4&gt;

&lt;p&gt;For a coding newbie, your first event can definitely be an intimidating
experience.  People will be throwing around terms like RESTful API, JSON, NoSQL,
and client library like they&amp;rsquo;re the most natural thing in the world.
Meanwhile, you&amp;rsquo;re sitting at API demos hoping wondering how the hell to
get a webpage displayed on localhost (or even wondering what the hell this magic
localhost is).&lt;/p&gt;

&lt;p&gt;If you want to spend your time developing software instead of learning
concepts, a little reading goes a long way. Being able to cite the HTTP spec
backwards (or even knowing what it is) certainly isn&amp;rsquo;t necessary, but if
you want to build a webapp, knowing about HTTP requests and responses will save
you a lot of conceptual headache.  Similarly, if you want to build a mobile app,
hello worlding an app in your simulator before the hackathon will save you a lot
of headache on the day of the event.&lt;/p&gt;

&lt;p&gt;If you&amp;rsquo;re not sure where to start learning some of the subjects
discussed above, there are a &lt;a
	href=&quot;http://www.codecademy.com/courses/p&gt;ython-intermediate-en-6zbLp&quot;&gt;ton&lt;/a&gt;
&lt;a
	href=&quot;http://net.tutsplus.com/tutorials/other/a&gt;-beginners-introduction-to-http-and-rest/&quot;&gt;of&lt;/a&gt;
&lt;a
	href=&quot;http://gigaom.com/2010/10/29/using-apis-not-quite-as-hard-as-it-looks/&quot;&gt;tutorials&lt;/a&gt;
&lt;a href=&quot;http://www.looah.com/source/view/2284&quot;&gt;out&lt;/a&gt; about utilizing APIs
for the web, with the first link there in particular being highly recommended.
It&amp;rsquo;s written in Python, but reading the code should be pretty
straightforward for anyone with programming knowledge.  If you are looking to do
something more mobile-based, the docs for starting &lt;a
	href=&quot;http://developer.android.com/sdk/installing/bundle.html&quot;&gt;Android
	development&lt;/a&gt; and &lt;a
	href=&quot;https://developer.apple.com/library/ios/referencelibrary/GettingStarted/RoadMapiOS/chapters/Introduction.html&quot;&gt;iPhone
	development&lt;/a&gt; are also ridiculously extensive.&lt;/p&gt;

&lt;p&gt;Even if you decide not to do any reading beforehand, there will assuredly be
tech talks and mentorship to get you up to speed with the basic terminology, so
don&amp;rsquo;t let a lack of background knowledge stop you from attending.&lt;/p&gt;

&lt;h4&gt;Known what you want to accomplish&lt;/h4&gt;

&lt;p&gt;This can be as simple or as vague as you&amp;rsquo;d like, but it&amp;rsquo;s always
good to have some type of plan about what you want to accomplish during your
24-48 hours.  Your goal can be something as simple as finish and demo SOMETHING,
or it can be as detailed as &amp;ldquo;build a game on Android where squirrels fly
through the air and eat exploding acorns&amp;rdquo;.&lt;/p&gt;

&lt;p&gt;If you&amp;rsquo;re coming to a hackathon with the goal of learning but
don&amp;rsquo;t know what you want to learn, just pick a random language (Python and
PHP are easiest for webapps) and plan to make an application that uses that
language.  Alternatively, if you&amp;rsquo;re stuck on an application idea, watch
the API demos and see if any of the APIs helps solve a problem that you&amp;rsquo;ve
encountered.  If you&amp;rsquo;re still stumped on a project, head to the
event&amp;rsquo;s pitch session and join a team that seems like it has an awesome
idea, there will be tons of teams there that would love to have your help.&lt;/p&gt;

&lt;p&gt;While we&amp;rsquo;re on the subject of teams, I want to address one of the most
common questions I see in the Rutgers Hackathon Club: &amp;ldquo;Do I need to go
with a team already in place?&amp;rdquo;.  The answer to that is no, not at all.  In
fact, you don&amp;rsquo;t even need to want to work with a team; it is perfectly
acceptable for you to go solo-bandito and work by yourself.  If coding solo
that&amp;rsquo;s not your cup of tea, there are also plenty of ways to join or
create a team on site.  For your first time, the easiest way to deal with teams
is either head in with an idea of some people you&amp;rsquo;d like to work with (it
doesn&amp;rsquo;t have a codified team, just 4-5 people you could envision yourself
working with), plan to work solo or plan to jump on board with someone
else&amp;rsquo;s team. There is also the option of trying to build and lead a team
of strangers on-site, however, unless you have experience with this, I&amp;rsquo;d
advise against trying to lead a team of strangers that you met at the event,
simply because working with new people always adds a bunch of layers of
complexity.&lt;/p&gt;

&lt;p&gt;Whatever your team and your goal, make sure to push your skills as a
developer.  Hackathons are a unique opportunity to have tons of mentorship at
your fingertips; take advantage of that by trying something hard and getting
extra help as necessary.&lt;/p&gt;

&lt;h4&gt;Talk to people&lt;/h4&gt;

&lt;p&gt;You&amp;rsquo;re probably coming to this event to code, but that doesn&amp;rsquo;t
mean that you need to spend all of your time creating features and debugging
errors; you should also spend some time getting to know the other students
attending the event.  Hackathons are frequented immense community of students
and mentors who travel to events multiple times a month, exchange ideas, and
generally share their passion for making awesome technology.  By taking time out
of your hackathon to meet other attendees, you will not only make some great
friends, but also you will find opportunities to learn more about programming,
get resources for your hack, and even find internships/jobs that you otherwise
wouldn&amp;rsquo;t have known about,&lt;/p&gt;

&lt;p&gt;Granted, if this is your first time at a hackathon, the prospect of making
new friends in a sea of 1,000 people could seem like a daunting task.  If
you&amp;rsquo;re a bit overwhelmed with how to get started meeting other hackathon
attendees, try one of these two ideas to get you started.&lt;/p&gt;

&lt;ol&gt; &lt;li&gt;&lt;p&gt;Go with your school/friends.  Chances are your school has a group of
	students who are interested in programming outside of the classroom, seek
	them out at your school CS lab, see what events they&amp;rsquo;re going to, and
	then join them for those events.  If you&amp;rsquo;re not sure what to look for,
	just listen for passionate debates about technology.  If the students
	involved do already regularly attend Hackathons, they will certainly be
	interested in traveling to one with you.  Regardless of how you find fellow
	hackers, don&amp;rsquo;t be shy about being new, I can guarantee you that your
	fellow developers would love to share their passion for technology with you.
	If you&amp;rsquo;re on the Eastern seaboard and don&amp;rsquo;t have a group of
	hackers at your school, drop me a line at &lt;a
		href=&quot;http://twitter.com/maltzj&quot;&gt;@maltzj&lt;/a&gt;, I&amp;rsquo;ll see if I can
	get you integrated with our network of Rutgers students.&lt;/p&gt;&lt;/li&gt;
	&lt;li&gt;&lt;p&gt;Once you&amp;rsquo;re at the event, wait for a little while and find
	someone who looks like they&amp;rsquo;re taking a break, walk over to them and
	ask them what they&amp;rsquo;re working on.  99 times out of 100 he or she will
	start excitedly talking to your about his or her team&amp;rsquo;s project.  Ask
	some questions about themselves, their school, and technology that
	they&amp;rsquo;re using. Then, get their name, and wish them good luck.  If you
	see that person again, check up on how their project is doing or
	congratulate them on an awesome presentation if it&amp;rsquo;s after
	demos.&lt;/p&gt;&lt;/li&gt; &lt;/ol&gt;


&lt;p&gt;After the event, if you feel like the you got along with someone, exchange
contact information (business cards and twitter are great for this), stay in
touch with your new friend via the interwebs, and catch up at events throughout
the year.  Congratulations, you just made a friend and &amp;ldquo;networked&amp;rdquo;,
that wasn&amp;rsquo;t such an icky and soulless process was it?&lt;/p&gt;

&lt;h4&gt;Always, always demo.&lt;/h4&gt;

&lt;p&gt;At the end of every event there will be a period where everyone who attended
can show off what they built to the other attendees.  No matter how far along
your project is, demo SOMETHING.  Seriously, even if it is a concept and half a
webpage, you should demo it.  For the last 24-48 hours you&amp;rsquo;ve worked hard
to build something that you would have thought impossible at the beginning of
the event.  You deserve to have your hard work rewarded, if not with a prize,
then at least with a round of applause from your peers.  In case you&amp;rsquo;re
thinking that you shouldn&amp;rsquo;t demo, let me share a story which changed the
way I looked at demoing forever.&lt;/p&gt;

&lt;p&gt;My first hackathon was the &lt;a href=&quot;http://2012s.pennapps.com/&quot;&gt;Spring
	Penapps in 2012&lt;/a&gt;.  After starting off with a ton of energy, the event
turned into a disaster which culminated in my team and I making a project called
&amp;ldquo;Easy Mood&amp;rdquo;, a website sort of like rainy mood but way uglier and
with kittens (side note: when in doubt, use kittens and gifs). When demo time
approached, I was feeling pretty ashamed our project and didn&amp;rsquo;t want to
submit it for presentation.  At around the same time, Rutgers Hackathon club
founder and Major League Hacking Commissioner, &lt;a
	href=&quot;https://twitter.com/swiftalphaone&quot;&gt;Swift&lt;/a&gt;, was walking around
talking to the Rutgers contingent about what they did.&lt;/p&gt;

&lt;p&gt;He came over, asked our team what we did, and I sheepishly explained our
project while confiding that I didn&amp;rsquo;t really want to present.  As soon as
the words left my mouth he said, in classic Swift fashion (with slightly choicer
language) &amp;ldquo;Jonathan, I don&amp;rsquo;t care what you say, you&amp;rsquo;re
presenting&amp;rdquo;.  This was immediately followed by a Swifttastic tirade in
which he simultaneously browbeat me into presenting while giving me enough
confidence to do so.  It was really quite impressive.   After that pep talk we
decided that there was really no downside to presenting our project, so we went
up their and sold Easy Mood as best we could.  It just so happened that we were
the only team to use a &lt;a href=&quot;http://www.mashery.com/&quot;&gt;Mashery API&lt;/a&gt;, so
one of my teammates ended up walking home with a Jambox, a $200 piece of
hardware.  Not bad for a group that was going to hide in the audience not more
than 30 minutes prior.&lt;/p&gt;

&lt;p&gt;If that isn&amp;rsquo;t enough for you, think about this: at some point in your
life you&amp;rsquo;re going to have to sell the idea that something is awesome.
Maybe that something will be a product that your company produces, or maybe it
will be yourself when an interviewer asks &amp;ldquo;Sally, tell me about this here
project on your resume&amp;rdquo;.  Regardless of what you&amp;rsquo;re selling, in
moments like those you need to know how to take something and make someone else
understand why it is awesome.  Hackathon demos are the best time to hone that
skill because no matter what happens, you have a supportive audience who will
cheer you on even if your demo is a catastrophic failure.&lt;/p&gt;

&lt;h4&gt;Wrapping Up&lt;/h4&gt;

&lt;p&gt;So that&amp;rsquo;s it, that&amp;rsquo;s all you need to do in order to get the most
out of your Hackathon experience.  You don&amp;rsquo;t need god-like web programming
skills and you don&amp;rsquo;t need to be able to know 10 different programming
languages.  Instead, all you need to do is show up to the event with a positive
attitude and follow the four simple actions I outlined above.  If you do that,
you&amp;rsquo;ll walk out of your first hackathon with a whole raft of new skills
and some new friends to boot.&lt;/p&gt;

&lt;em&gt;This post initially appeared on the &lt;a href=&quot;http://mlh.io&quot;&gt;Major League
		Hacking&lt;/a&gt; blog.&lt;/em&gt;

</content>
 </entry>
 
 
</feed>