<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Brendan Powers</title>
    <description>The latest articles on DEV Community by Brendan Powers (@brendan0powers).</description>
    <link>https://dev.to/brendan0powers</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F151943%2F766679d4-9106-4284-971e-dfe4cada0ba3.jpeg</url>
      <title>DEV Community: Brendan Powers</title>
      <link>https://dev.to/brendan0powers</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/brendan0powers"/>
    <language>en</language>
    <item>
      <title>Writing Effective Interview Questions</title>
      <dc:creator>Brendan Powers</dc:creator>
      <pubDate>Mon, 03 Feb 2020 16:41:45 +0000</pubDate>
      <link>https://dev.to/brendan0powers/how-to-write-interview-questions-that-don-t-suck-40nk</link>
      <guid>https://dev.to/brendan0powers/how-to-write-interview-questions-that-don-t-suck-40nk</guid>
      <description>&lt;p&gt;Do you remember preparing for your last interview? You might have bought one of the books on interviewing, or spent time practicing on sites like HackerRank or LeetCode. Perhaps you read one of the many articles on “The 13 most popular React.js interview questions!”. What was your interview experience like? Was it engaging and fun, or frustrating and disheartening? I certainly have memories of interviews on both ends of the spectrum.&lt;/p&gt;

&lt;p&gt;What about the last time you were interviewing for a position on your team? How much prep work did you do? If you were anything like me, you’d start reviewing the resume and looking for a question about 15 minutes before the interview started.&lt;/p&gt;

&lt;p&gt;Interviews seem like a burden. They’re a distraction from whatever you’re currently working on, but the outcome of the interview is just as important to you as it is to the person you are interviewing. The decisions you make during and after the interview will affect your work life for the next few years. Get it right, and you have a wonderful new team member, someone you love to work with.&lt;/p&gt;

&lt;p&gt;With so much at stake, there’s surprisingly little information available for the people who are giving the interviews. I thought I’d share my thoughts on the subject. Hopefully, some people might find it useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Know why you are asking the question
&lt;/h3&gt;

&lt;p&gt;Why do we ask technical interview questions? Think about the sorts of things you want to know about a candidate. Can you code? Do you have good debugging skills? Do you have good problem-solving skills? Unfortunately, you won’t get very far by asking these questions directly. Interviewing would be so much simpler if you could!&lt;/p&gt;

&lt;p&gt;Instead, you need to go after the answers indirectly. You do this by asking the candidate to perform some task and then observe their behavior. That is the function of the technical interview question. It’s just an excuse to get the candidate to perform a task you can observe.&lt;/p&gt;

&lt;p&gt;With this in mind, it’s important to know what qualities you are looking for before picking a question. You can then evaluate any given question based on how it might give you insight into those qualities. For example, let’s say you want to evaluate the candidate’s design skills. You might ask a question like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;I have a Vehicle base class with these functions: make(), model(), weight(), hasTowHook(), canPlugIn(), hornSound(). Possible types of vehicles might include a sedan (Toyota Camry), a pickup (Ford F150), or an EV (Chevy Bolt). Design me a class hierarchy that represents these different models.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;There are a couple of issues with this question, but the biggest one is that it doesn’t meet our requirements. It might be an adequate test of basic polymorphism, but it’s not complicated enough to get a good sense of a candidate’s design skills. A better question might be:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;You're building a web UI for commercial property owners to manage their security cameras. Each camera has some properties (make, model, location, orientation, etc…). You'll also need to keep track of other objects, like users, permissions, buildings, recordings, etc. The application needs to be able to export a backup file. This file needs to be readable by newer versions of the application. Design a system to take all the cameras and related data, and write that file.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is a much better question for evaluating design skills. First, the problem is more realistic. There is a lot of detail to be considered. What data format do you use? How do the objects relate to each other? How do you handle versioning and compatibility? Do you care about making the file easy to read, or making the size of the file small? There are many, many valid solutions to this problem. Exploring the possibilities with a candidate will give you a lot of insight into how they think.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If all you learn from a question is how many hours a candidate has spent on HackeRank, then perhaps it’s time to find another question.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The question should be relevant to the work the candidate will be doing
&lt;/h3&gt;

&lt;p&gt;If the person you are interviewing gets through the interview and accepts the offer, you’ll be working with them five days a week for the next few years. You need to make sure they are comfortable doing the day-to-day work that makes up the bulk of software development.&lt;/p&gt;

&lt;p&gt;If that’s the case, why do we so often ask about obscure topics during an interview? We try to asses whether a candidate has a strong background in computer science when in practice, it has very little relation to real software development. If you ask about theoretical topics, you’ll get a sense of the candidate’s background. If you ask practical questions that resemble the work you do every day, you’ll get a sense of what it’s like to actually work with the candidate.&lt;/p&gt;

&lt;p&gt;Let’s look at a couple of example questions:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;You are updating an existing REST request for your backend API when you notice that sometimes, the requests take a second or two to respond. You check your metrics dashboard and notice that your p90 latency looks good, but p99 is much higher than you expect. Where would you start your investigation?&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you’re a ruby shop looking for a backend engineer, this is a pretty good question. It’s quite likely that you’ve needed to debug a performance issue at some point in the recent past. Someone who is joining your team should be familiar with the process of debugging this kind of issue. On the other hand, not everyone has been exposed to latency percentiles. You would need to be prepared to explain the concept.&lt;/p&gt;

&lt;p&gt;Now, let’s look at another question:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;You are creating a new dictionary service, exposed to your users via a REST API. There are two requests. A POST request to add a new word to the dictionary and a GET request to get auto-complete suggestions when the user starts typing. Implement these two requests.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This one is a bit trickier. Depending on what you expect the answer to be, it could be a really great, useful question, or an irrelevant frustrating one. If you expect the candidate to take the words from the POST request, and add them to a database, then query that database with the GET request, then this is a great question. Building this sort of autocompleted search is a pretty common task for a Rails developer. There’s enough detail here to determine if the candidate is familiar working with databases, you can discuss the table structure, what indexes to use, and whether using something like ElasticSearch makes sense.&lt;/p&gt;

&lt;p&gt;On the other hand, if your expected answer is to have the developer build a trie, and then use that for the auto-complete request, then you’re in trouble. If you were looking for an in-memory solution to the problem, a trie would be a great way to solve this particular problem, but tries are not a commonly used data structure. It’s unlikely that your average rails developer will ever need to use one. If a candidate fails to answer this question, have you really learned anything important?&lt;/p&gt;

&lt;p&gt;There are good reasons for wanting to avoid databases in questions like this. You might be doing a coding phone screen, and adding a database might make the question too complex to implement quickly. In this case, implementing a simple in-memory solution is perfectly fine. When doing this though, stick with data structures that are commonly used in the work you do. For the vast majority of developers, this is limited to lists and hash tables. Depending on the language used, you might have a few different kinds of lists, and perhaps an ordered map. Queues are also a good choice. Other data structures commonly found in interview questions such as heaps, trees, and graphs are rarely encountered in the real world and should be avoided. If you can’t elegantly solve the problem without resorting to obscure data structures, then the problem is a poor choice.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If your candidates need to study for your interview, you are probably asking the wrong questions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Make the question clear and easy to understand
&lt;/h3&gt;

&lt;p&gt;Interviews are stressful! It can be hard to answer tricky technical questions when under pressure. Have mercy on the person your interviewing and spend some time making sure your question is clear. Not only will they appreciate it, but you’ll have a much better chance of getting a useful answer.&lt;/p&gt;

&lt;p&gt;How do you know if your question is clear? Test it! We test our code, why not do the same for our interview questions? Ask a teammate the question and see how they do with it. This is great for two reasons. They’ll usually be honest with you and let you know what they think, and now you have a baseline to use when you ask the question in a real interview. Once you’ve done this a few times, you’ll start to get a feel for the process.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Friends don’t let friends ask buggy interview questions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Leave room for side conversations
&lt;/h3&gt;

&lt;p&gt;Some of the best interviews I’ve been involved in are ones where the conversation veered off track into an interesting side topic. For example, in a recent interview, I asked a candidate how to make a piece of code he’d just written thread-safe. The obvious answer would have been to add a mutex. Instead of giving the answer I expected, he pointed out that if I cared at all about the performance of the code, it should never be run from more than one thread. We then got into a conversation about how modern multi-core CPUs handle caching, and we discussed various methods of getting data in and out of the thread running the code efficiently.&lt;/p&gt;

&lt;p&gt;This wasn’t the answer I expected. Instead, I got a great conversation that gave me a lot more insight into how the candidate thought. It was also a great opportunity to have a conversation outside the formal bounds of an interview question.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you get an answer you didn’t expect, dig a little deeper.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;I hope this post has given you some things to think about the next time you’re giving an interview. If nothing else, don’t pick the first acceptable looking interview question you find 15 minutes before the interview starts. Take a little time to think it through. Test the question with a colleague. The person you are interviewing will appreciate the effort.&lt;/p&gt;

</description>
      <category>career</category>
    </item>
    <item>
      <title>Burn Your Backlog</title>
      <dc:creator>Brendan Powers</dc:creator>
      <pubDate>Sun, 15 Dec 2019 13:48:45 +0000</pubDate>
      <link>https://dev.to/brendan0powers/burn-your-backlog-4epd</link>
      <guid>https://dev.to/brendan0powers/burn-your-backlog-4epd</guid>
      <description>&lt;p&gt;Somewhere out there are teams with a meticulously groomed backlog. They spend time each week going through their backlog with the team’s product manager, stories prioritized, tech debt is taken care of, and old or unnecessary stories pruned. Sprint planning is a breeze, and everyone goes out for cupcakes afterward. If this is your team, feel free to stop reading now.&lt;/p&gt;

&lt;p&gt;Unfortunately, I’ve never experienced this kind of backlog grooming nirvana. I’ve been on many high functioning teams, some of them with agile processes that worked quite well. Every one of them suffered from an ever-expanding backlog, always creating new work faster than they could complete it.&lt;/p&gt;

&lt;p&gt;Why should you care about a messy backlog? Well-groomed backlogs tend to be small, and small backlogs are a real advantage. It’s much easier to manage a small backlog. You can sort the items by their priority, determine where new issues fit and plan for the next sprint in a few minutes. If your backlog is small enough to fit in your head, then you can reason about it as a whole and make decisions quickly. Each new story in your backlog makes it a little harder to manage, so it’s critical that each issue be worth the cost.&lt;/p&gt;

&lt;p&gt;If it’s so important to keep your backlog focused, why does it always become an unmanageable mess? Generally, this comes from planning too far ahead. You add a new story or plan a new feature in the anticipation that you’ll need it in a few months. Once created, you quickly forget about it. You might occasionally run across the story and think, “Oh yea, we should get around to that at some point.”. Congratulations, you’ve just created a zombie story, doomed to roam your backlog in search of a brain to distract. If you find yourself doing this, it’s time to take out the proverbial shotgun and put it out of its misery.&lt;/p&gt;

&lt;p&gt;So often, we find it hard to dispose of issues that are no longer relevant. We hang on to issues, worrying that we might lose something valuable if we closed them. We create new work faster than we can complete it. After a year or so of doing this, we end up with a backlog worthy of a Hoarders episode.&lt;/p&gt;

&lt;p&gt;When I’m worried about something, I like to think through the worst-case scenario. These “worst-cases” usually aren’t as bad as we feared. So let’s try a thought experiment. What if you lost your entire backlog. All of your stories, sprints, and epics deleted with no backups. What would you do?&lt;/p&gt;

&lt;p&gt;You’d probably start by re-creating the current sprint. Then you’d work from your roadmap or memory to re-create any near-term projects. You might also re-create any memorable feature requests or cleanup items.&lt;/p&gt;

&lt;p&gt;What about all the issues you forgot to re-create? What if you forgot something important? While it’s reasonable to worry, important tasks have a way of making themselves known. If it’s important, it will come back up in a meeting, a user will mention it, or you’ll remember when you run across some troublesome bit of code. If you don’t remember to re-create an issue, and it never comes up again, have you lost anything by forgetting it?&lt;/p&gt;

&lt;p&gt;I’m certainly not suggesting you go out and delete your entire backlog. Think of it more as a short-cut for determining whether the issue matters. Consider what would happen if it was gone. If you think you’d end up re-creating, then keep it. Otherwise, close it, and leave room in your head for the issues that have a real impact.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>agile</category>
      <category>productivity</category>
      <category>storyhoarding</category>
    </item>
    <item>
      <title>Pretty Printing CRDs with Kubebuilder</title>
      <dc:creator>Brendan Powers</dc:creator>
      <pubDate>Sat, 02 Nov 2019 17:53:45 +0000</pubDate>
      <link>https://dev.to/brendan0powers/pretty-printing-crds-with-kubebuilder-2jbn</link>
      <guid>https://dev.to/brendan0powers/pretty-printing-crds-with-kubebuilder-2jbn</guid>
      <description>&lt;p&gt;If you’ve developed a CRD with Kubebuilder, you know how nice the code generation features are. It lets you define your CRD using standard Go object, and then add additional information like documentation. Did you know, that you can also control how kubectl prints your CRD as well?&lt;/p&gt;

&lt;p&gt;Let’s look at an example from my &lt;a href="https://github.com/brendan0powers/codebook"&gt;Codebook&lt;/a&gt; project. Codebook is designed to bring up a set VS Code Server instances for use in training classes. In this project, I have a resource called Group. The Group resource is where I store collective information about a class. For example, what image should be used, how long any instance is allowed to run, resource limits, etc… When I list Groups with kubectl, I get something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get &lt;span class="nb"&gt;groups
&lt;/span&gt;NAME        AGE
default     2d15h
testgroup   61s
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This is useful, but not all that informative. I know that I have two groups, and how old they are. To get more information, I’d need to do a &lt;code&gt;kubectl describe&lt;/code&gt; for each instance. This will quickly get tedious. Since groups contain sets of VS Code instances, I’d really like to know how many instances there are, and how many are running. Let’s look at the status object for a Group.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// GroupStatus defines the observed state of Group&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;GroupStatus&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;// +optional&lt;/span&gt;
  &lt;span class="n"&gt;Instances&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;GroupInstanceStatus&lt;/span&gt; &lt;span class="s"&gt;`json:"instances,omitempty"`&lt;/span&gt;

  &lt;span class="n"&gt;NumInstances&lt;/span&gt;        &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="kt"&gt;int64&lt;/span&gt; &lt;span class="s"&gt;`json:"numInstances"`&lt;/span&gt;
  &lt;span class="n"&gt;NumRunningInstances&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="kt"&gt;int64&lt;/span&gt; &lt;span class="s"&gt;`json:"numRunningInstances"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We have to properties (NumInstances, and NumRunningInstances) that have what we need.&lt;br&gt;
We can use the &lt;code&gt;+kubebuilder:printcolumn&lt;/code&gt; annotation to tell kubebuilder to add the needed information to our CRD. I place them right after the &lt;code&gt;+kubebuilder:object:root=true&lt;/code&gt; annotation.&lt;br&gt;
For example, let’s print the number of instances.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// +kubebuilder:object:root=true&lt;/span&gt;
&lt;span class="c"&gt;// +kubebuilder:printcolumn:name="Instances",type="integer",JSONPath=".status.numInstances",description="Number of instances in group"&lt;/span&gt;

&lt;span class="c"&gt;// Group is the Schema for the groups API&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Group&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The printcolumn annotation has a few different options, we only used a few in this example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;name:&lt;/strong&gt; This is the title of the new column, printed in the header by kubectl.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;type:&lt;/strong&gt; The data type of the value being printed. Valid types are integer, number, string, boolean and date.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSONPath:&lt;/strong&gt; This is a dot notated path to the date you want to print. In our case, the numInstances property in the Status object, so we use .status.numInstances. Notice that we use numInstances, not NumInstances. The JSONPath property refers to the generated JSON CRD, not the native Go classes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description:&lt;/strong&gt; A human-readable string describing the column. I don’t actually know if these are printed anywhere, but I leave them in just in case.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now that we have our annotation created, we can run &lt;code&gt;make install&lt;/code&gt;, and try listing our CRD again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get &lt;span class="nb"&gt;groups
&lt;/span&gt;NAME        INSTANCES
default     2
testgroup   1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Cool! We can now see the number of running instances in each group. Where did the Age column go though? It seems that when you start adding custom columns, any default columns are no longer shown (aside from Name, I guess). So let’s add the Age column back, and we can add the number of running instances while we are at it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// +kubebuilder:object:root=true&lt;/span&gt;
&lt;span class="c"&gt;// +kubebuilder:printcolumn:name="Instances",type="integer",JSONPath=".status.numInstances",description="Number of instances in group"&lt;/span&gt;
&lt;span class="c"&gt;// +kubebuilder:printcolumn:name="Running",type="integer",JSONPath=".status.numRunningInstances",description="Number of running instances in group"&lt;/span&gt;
&lt;span class="c"&gt;// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp"&lt;/span&gt;

&lt;span class="c"&gt;// Group is the Schema for the groups API&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Group&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;make install&lt;/code&gt;, and then list the groups again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get &lt;span class="nb"&gt;groups
&lt;/span&gt;NAME        INSTANCES   RUNNING   AGE
default     2           2         2d16h
testgroup   1           1         31m
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Awesome, we now see the number of running instances, and our age column is back. This is a lot more useful than what we started out with. It could be more useful though. What if we wanted to know more than just the current status of the Group? It would be nice to tell them apart in some way. One of the ways we could do that is to display the image for each Group. The group object is not in the status, it’s in the spec. This is not a problem for column annotations we simply use &lt;code&gt;.spec&lt;/code&gt; instead of &lt;code&gt;.status&lt;/code&gt; in the JSONPath property. The new annotation looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// +kubebuilder:printcolumn:name="Image",type="string",JSONPath=".spec.image"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;When we list our Groups again, we now see the image!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get &lt;span class="nb"&gt;groups
&lt;/span&gt;NAME        INSTANCES   RUNNING   AGE     IMAGE
default     2           2         2d16h   codercom/code-server:v2
testgroup   1           1         36m     codercom/code-server:v2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This is useful to know, but perhaps it’s a bit much for the default output. What if we’d like to hide the field, and only show it when requested? This is where the priority field comes in. We’ve left it out so far, and each of our columns has the default value of 0. If you set priority to any number above 1, it will only show up when you specify &lt;code&gt;-o wide&lt;/code&gt;. Let’s try it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// +kubebuilder:printcolumn:name="Image",type="string",priority=1,JSONPath=".spec.image"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;When we re-run kubectl, we no longer see the image column.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get &lt;span class="nb"&gt;groups
&lt;/span&gt;NAME        INSTANCES   RUNNING   AGE
default     2           2         2d16h
testgroup   1           1         31m
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;When we add &lt;code&gt;-o wide&lt;/code&gt;, the field shows up again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;kubectl get group &lt;span class="nt"&gt;-o&lt;/span&gt; wide
NAME        INSTANCES   RUNNING   AGE     IMAGE
default     2           2         3d16h   codercom/code-server:v2
testgroup   1           1         24h     codercom/code-server:v2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;That covers most of the features of the printcolumn annotation. If you’d like a little more detail, check out the &lt;a href="https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#additional-printer-columns"&gt;CRD docs&lt;/a&gt; on the additionalPrinterColumns field.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>kubebuilder</category>
      <category>tips</category>
    </item>
  </channel>
</rss>
