<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.0">Jekyll</generator><link href="https://thisiskyle.me/feed.xml" rel="self" type="application/atom+xml" /><link href="https://thisiskyle.me/" rel="alternate" type="text/html" /><updated>2021-10-01T05:47:31+00:00</updated><id>https://thisiskyle.me/feed.xml</id><title type="html">This is Kyle</title><subtitle>Kyle Sherman's Writing</subtitle><entry><title type="html">Writing Effective Software Development Notes for Future You</title><link href="https://thisiskyle.me/posts/writing-effective-software-development-notes-for-future-you.html" rel="alternate" type="text/html" title="Writing Effective Software Development Notes for Future You" /><published>2021-09-28T00:00:00+00:00</published><updated>2021-09-28T00:00:00+00:00</updated><id>https://thisiskyle.me/posts/writing-effective-software-development-notes-for-future-you</id><content type="html" xml:base="https://thisiskyle.me/posts/writing-effective-software-development-notes-for-future-you.html">&lt;p&gt;Have you ever found yourself saying, “I feel like I’ve solved this type of issue before, but I can’t remember how I did it”? Have you found it difficult to come back to a task once you’ve been interrupted? These issues can be solved by taking notes during development. I started experimenting with taking notes quite a few years ago and found the benefits to be quite substantial. It may sound like just another thing for you to do. Through this article, I will show you how it can be very little effort and very effective for solving these issues and making you a better, more organized, and more efficient developer.&lt;/p&gt;

&lt;h2 id=&quot;what-kind-of-notes&quot;&gt;What Kind of Notes?&lt;/h2&gt;
&lt;p&gt;The purpose of this style of note-taking is to be thorough. This allows you to search through this text later. The notes should be detailed enough to be able to transport yourself back into the code later, the way you were engrossed in the problem when you first worked on it. With these goals in mind, it’s best to write these notes in a step-by-step, stream of consciousness style. This allows you to be transported back into your consciousness very naturally. Write as if you were explaining to someone every step of what you’re doing.&lt;/p&gt;

&lt;p&gt;To write verbose notes that don’t become unwieldy, an outline format using headings, subheadings, and bullet points is best. This enables you to section off approaches you explore and ideas you have and make bullet points for the steps you take with sub-bullets for detailed sub-steps.&lt;/p&gt;

&lt;h2 id=&quot;why&quot;&gt;Why?&lt;/h2&gt;
&lt;p&gt;Taking notes in this fashion has many benefits, such as:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Easily come back to a problem after being distracted or away from the problem&lt;/li&gt;
  &lt;li&gt;Be able to search all text to find problems you’ve solved before, which are similar to the one you’re facing now&lt;/li&gt;
  &lt;li&gt;Provide information on alternative approaches and reasoning for your solution to other developers&lt;/li&gt;
  &lt;li&gt;Provide context for later in the future when you may leave and others need to work with your code&lt;/li&gt;
  &lt;li&gt;Stay focused&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;writing-the-notes&quot;&gt;Writing the Notes&lt;/h2&gt;
&lt;h3 id=&quot;picking-your-tool&quot;&gt;Picking your tool&lt;/h3&gt;
&lt;p&gt;First, you should pick an app. The best thing is to research and pick one app and stick with it, so you don’t waste time moving between apps often. I’ve tried quite a few, and here are the requirements I think it should have:&lt;/p&gt;

&lt;h4 id=&quot;requirements&quot;&gt;Requirements&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Spell check disabled for marked blocks of text&lt;/li&gt;
  &lt;li&gt;Doesn’t autocorrect in bad ways in these marked blocks&lt;/li&gt;
  &lt;li&gt;Export to PDF&lt;/li&gt;
  &lt;li&gt;Export to plain text&lt;/li&gt;
  &lt;li&gt;Allow for writing structured code within it&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;nice-to-have&quot;&gt;Nice to Have&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Helps with code indentation
    &lt;ul&gt;
      &lt;li&gt;At least doesn’t actively work against you&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Outline view&lt;/li&gt;
  &lt;li&gt;Drawing for diagrams
    &lt;ul&gt;
      &lt;li&gt;Searching of handwriting&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Syntax highlighting&lt;/li&gt;
  &lt;li&gt;Links to other notes&lt;/li&gt;
  &lt;li&gt;Tagging&lt;/li&gt;
  &lt;li&gt;Collaboration&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;apps-i-recommend&quot;&gt;Apps I Recommend&lt;/h4&gt;
&lt;p&gt;I have found 2 apps to be most useful for these types of notes: &lt;a href=&quot;https://ulysses.app/&quot;&gt;Ulysses&lt;/a&gt; and &lt;a href=&quot;https://bear.app/&quot;&gt;Bear&lt;/a&gt;. Both of these tools offer great organization options for your notes like tagging, folders, and advanced filtering. They also both have numerous helpful export options. This allows you to be able to move your note to another tool or share with others easily. They both use a form of Markdown for writing, which I find very natural and easy for making this type of outline notes and writing code within your note.&lt;/p&gt;

&lt;h3 id=&quot;note-structure&quot;&gt;Note Structure&lt;/h3&gt;
&lt;h4 id=&quot;individual-note-structure&quot;&gt;Individual note structure&lt;/h4&gt;
&lt;p&gt;The way you organize your note can help you organize your thoughts. Let’s start with the title of the note. You should have a title that reminds you of the problem you’re trying to solve. I also recommend mentioning a task number if there is one that you can associate with the task or bug in the task management system you use. This way, you can search through your notes effortlessly. 
I recommend always having a short overview section of what you are trying to do in the task.&lt;/p&gt;

&lt;p&gt;Depending on how much you already know about the problem, the organization after that can either be set up initially or will present itself to you as you move through solving the problem. The process I usually follow goes something like this:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Start with an Investigation section&lt;/li&gt;
  &lt;li&gt;Use bullet points for each thought I have or strategy I try&lt;/li&gt;
  &lt;li&gt;Indent as I go off in a specific direction to keep my bullets short and organized&lt;/li&gt;
  &lt;li&gt;As I find that there is a particularly long sub-bullet section, pull that out into its own sub-heading&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oftentimes, I find that a direction I went down didn’t prove fruitful. In this case, I don’t delete my notes, I simply start a new main heading and potentially rename the last one. At this point, I understand the problem more and can give this new section a better title than just Investigation.&lt;/p&gt;

&lt;p&gt;In the end, my note structure ends up looking something like this:&lt;/p&gt;

&lt;div class=&quot;language-md highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gh&quot;&gt;# &amp;lt;taskNumber&amp;gt; Implement cool feature&lt;/span&gt;
&lt;span class=&quot;ge&quot;&gt;_link to task_&lt;/span&gt;

&lt;span class=&quot;gu&quot;&gt;## Overview&lt;/span&gt;
Short summary of task

&lt;span class=&quot;gu&quot;&gt;## Investigation&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; Short bullets following my thought process
&lt;span class=&quot;p&quot;&gt;	-&lt;/span&gt; Sub-bullets for steps related specifically to the parent bullet

&lt;span class=&quot;gu&quot;&gt;### Unexpected difficult situation&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; Subheadings like these throughout to keep nesting shallow

&lt;span class=&quot;gu&quot;&gt;## Implementation&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; Step-by-step implementation
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; Throughout the note always use full &lt;span class=&quot;sb&quot;&gt;`MyClass`&lt;/span&gt; and &lt;span class=&quot;sb&quot;&gt;`myFunction`&lt;/span&gt; names to make searching easier

&lt;span class=&quot;gu&quot;&gt;### Bug: Something isn't working&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; If I encounter a bug during implementation
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; This helps if you run into this again as a regression if you change things later
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To keep track of all my notes, I like to add “In Progress” and “Completed” tags to my notes. There are also times when you start a task and end up abandoning it. In that case, I can remove the “In Progress” tag, but not add the “Completed” tag. This way I can filter by these tasks that were abandoned if I want to pick them up later.&lt;/p&gt;

&lt;h3 id=&quot;how-note-taking-supports-effective-software-teams&quot;&gt;How Note-Taking Supports Effective Software Teams&lt;/h3&gt;
&lt;p&gt;Make sure that you keep all of these notes in a searchable format, so you can get the benefit of learning from past problems you’ve solved. Furthermore, it can be very helpful to put the note, or a modified overview of the note, in that task management system you or your team use, like Jira, Notion, GitHub, etc. Taking this thorough approach to documentation helps other developers understand why you made specific changes when they reference source control commits, particularly as code ages and team members change.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In addition to this type of notes, I also utilize diagrams (like UML class and sequence diagrams) and create test projects, so don’t feel bound to only use this format. I will potentially be writing a post about how I use diagrams and test projects. Reach out to me if you are interested in this topic. I highly recommend trying out this note-taking approach. I have been doing it for a few years now and have been shocked by how much benefit it has provided me. Others I have told about this approach to note-taking have echoed similar sentiments back to me. If you do try this, please let me know how it goes. Please don’t hesitate to reach out using the contact form in the About Me section of this site.&lt;/p&gt;</content><author><name></name></author><category term="Software Development" /><summary type="html">Have you ever found yourself saying, “I feel like I’ve solved this type of issue before, but I can’t remember how I did it”? Have you found it difficult to come back to a task once you’ve been interrupted? These issues can be solved by taking notes during development. I started experimenting with taking notes quite a few years ago and found the benefits to be quite substantial. It may sound like just another thing for you to do. Through this article, I will show you how it can be very little effort and very effective for solving these issues and making you a better, more organized, and more efficient developer.</summary></entry><entry><title type="html">Ensuring Designs Work for All Users With SwiftUI Previews</title><link href="https://thisiskyle.me/posts/ensuring-designs-work-for-all-users-with-swiftui-previews.html" rel="alternate" type="text/html" title="Ensuring Designs Work for All Users With SwiftUI Previews" /><published>2020-02-18T00:00:00+00:00</published><updated>2020-02-18T00:00:00+00:00</updated><id>https://thisiskyle.me/posts/ensuring-designs-work-for-all-users-with-swiftui-previews</id><content type="html" xml:base="https://thisiskyle.me/posts/ensuring-designs-work-for-all-users-with-swiftui-previews.html">&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;SwiftUI introduced a new way to rapidly iterate your UI using a preview canvas that constantly updates right next to your code. SwiftUI previews also have the ability to show multiple different previews simultaneously.&lt;/p&gt;

&lt;p&gt;There are many different ways you can utilize previews; you could even switch between different sets of previews. To take advantage of this new tool, I made an easy way to make sure that the UI you’ve created will work well in all different configurations, including device type (iPhone, iPad), accessibility features, internationalization, and landscape mode.&lt;/p&gt;

&lt;p&gt;If you’d like to skip to the code, it’s all here &lt;a href=&quot;https://gist.github.com/drumnkyle/b936ed856e4d41eb0122d487cc98c24b&quot;&gt;gist here&lt;/a&gt;, covered under the MIT license, so feel free to copy it and do whatever you’d like with it.&lt;/p&gt;

&lt;h2 id=&quot;developing-a-solution&quot;&gt;Developing a Solution&lt;/h2&gt;
&lt;p&gt;A great aspect of SwiftUI is how you can easily create your own view modifiers that encapsulate multiple other view modifiers and logic within one small, single-line statement.&lt;/p&gt;

&lt;p&gt;Here is an example of a custom view modifier:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/drumnkyle/f2d65ace67d04ad6ed678f2c0adb74f7.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;I haven’t yet found a way to limit a modifier to only be available in a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PreviewProvider&lt;/code&gt;. If you know a way to do this, &lt;a href=&quot;https://twitter.com/drumnkyle&quot;&gt;tweet at me&lt;/a&gt; or send me a message through the &lt;a href=&quot;https://thisiskyle.me/contact&quot;&gt;contact form&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Previews allow you to make a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Group&lt;/code&gt; around a set of different views or configurations to show multiple previews simultaneously. Using this concept, I figured I could make a view modifier that encapsulates the view created for a preview in a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Group&lt;/code&gt; and make multiple versions of the given content with different configurations.&lt;/p&gt;

&lt;p&gt;Here is an example of a preview using a group to make multiple previews:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/drumnkyle/8da86fa3ae4972c14a1ac833a02e3e52.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;There are 2 cases I want to test: a view that is meant to display full screen, and one that is a reusable component. The cases are different because in the former case, you want to have different device types tested, whereas in the latter case, it is likely a custom size. Therefore, the properties you change for testing on a reusable component are only environment properties like text size and color scheme, rather than device type. With these 2 cases in mind, I created 2 different view modifiers: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AllDevicesPreview&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AllComponentPreviews&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you have a preview, just add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.allPreviewDevices()&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.allComponentPreviews()&lt;/code&gt; to your full screen view or reusable component, respectively. You’re also able to define multiple cases to preview, such as different sample data. For instance, in this example we set one small string and one long one. Adding the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.allComponentPreviews()&lt;/code&gt; will make 2 previews of each edge case with each set of data.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/drumnkyle/e8b69ab01c2b402daf05a1b670244982.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.allPreviewDevices()&lt;/code&gt; modifier also takes in a parameter of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;deviceTypes&lt;/code&gt; where you can specify only &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iPhone&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iPad&lt;/code&gt;. If you’re in a tvOS target, you can specify &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tv&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;These previews can take a while to render and use a lot of CPU, so I recommend using just a single preview while creating the view. Then, once you finish a certain part of the view and want to check how it performs, add the modifier to see if the design breaks.&lt;/p&gt;

&lt;p&gt;Feel free to reach out to me on &lt;a href=&quot;https://twitter.com/drumnkyle&quot;&gt;Twitter&lt;/a&gt; or through the &lt;a href=&quot;https://thisiskyle.me/contact&quot;&gt;contact form&lt;/a&gt; to tell me what you think.&lt;/p&gt;

&lt;p&gt;Here is a &lt;a href=&quot;https://gist.github.com/drumnkyle/b936ed856e4d41eb0122d487cc98c24b&quot;&gt;link to the gist&lt;/a&gt; with the full code covered under the MIT license, so feel free to copy it into your own project and do whatever you’d like with it&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: SwiftUI previews are limited to show 15, so I made a decision on what cases I felt were most important and provided the best coverage. Feel free to make your own determination.&lt;/p&gt;</content><author><name></name></author><category term="Software Development" /><summary type="html">Introduction SwiftUI introduced a new way to rapidly iterate your UI using a preview canvas that constantly updates right next to your code. SwiftUI previews also have the ability to show multiple different previews simultaneously.</summary></entry><entry><title type="html">Fostering Strengths &amp;amp; Improving Weaknesses</title><link href="https://thisiskyle.me/posts/fostering-strengths-improving-weaknesses.html" rel="alternate" type="text/html" title="Fostering Strengths &amp;amp; Improving Weaknesses" /><published>2019-05-29T00:00:00+00:00</published><updated>2019-05-29T00:00:00+00:00</updated><id>https://thisiskyle.me/posts/fostering-strengths-improving-weaknesses</id><content type="html" xml:base="https://thisiskyle.me/posts/fostering-strengths-improving-weaknesses.html">&lt;p&gt;In listening to the podcast episode of &lt;a href=&quot;https://podcasts.apple.com/us/podcast/when-strength-becomes-weakness/id1346314086?i=1000436121595&quot;&gt;WorkLife with Adam Grant: When Strength Becomes Weakness&lt;/a&gt;, I thought about two different situations in my career that related to the two topics discussed. The episode discusses the idea of improving your weaknesses versus fostering your strengths. It posits that people spend too much time focusing on their weaknesses and not enough time on fostering their strengths. I agree with this notion and the following are two stories from my career that come to mind.&lt;/p&gt;

&lt;p&gt;The first time I had to switch teams at LinkedIn, I had the option to work on a growth team or a feature focused team. I was encouraged to take the position on the growth team by upper management. I decided to listen to upper management and choose the growth team. I knew that I disliked working on growth because much of it runs counter to my strengths and passions of focusing on the best user experience. However, I rationalized the switch as it would allow me to learn more about this area and improve my weaknesses. I figured that it is useful to know about growth if I ever started my own company. After 6 months, I found that I had already known enough about growth from my previous work for most purposes. I was just unhappy with the work and needed a switch. In hindsight, it would’ve been better for to just move to the team where I knew I’d be happy.&lt;/p&gt;

&lt;p&gt;The second situation relates to fostering my strengths. The first manager I had didn’t give me much constructive feedback during the year. When the annual review time came, I received a poor review. The review pointed out things I had never heard before; it seemed to say I needed to do more of something, but in the next point said that I did too much of that in another project. That manager was also leaving the company at the same time, so I didn’t get much detail or explanation. This negative review impacted my career and ability to get a raise and promotion. A manager should give you constructive feedback throughout the year and not just at review time when you are unable to improve. Be sure to always ask your manager for this feedback regularly to help you avoid this type of situation. If you do this and still only get negative feedback at review time, I would suggest moving to a different team or company.&lt;/p&gt;

&lt;p&gt;My next manager, however, was great! I was previously working on Android for the majority of my time, though I was still relatively new to the platform. My new manager allowed me to work on iOS and told me to use my deep knowledge and long history with the platform to my advantage. He called on me to amplify and utilize my strengths. The encouragement he provided and opportunities he helped me to get, led to me becoming a leader in the iOS development community at LinkedIn and earning a promotion to senior software engineer.&lt;/p&gt;

&lt;p&gt;I agree with Adam’s thoughts in the episode that fostering strengths can be very powerful and helpful to your growth in your career. I encourage everyone to find things they excel at and push those skills forward even more. I highly encourage you to listen to this episode and all of the others as they are very thoughtful and helpful.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://podcasts.apple.com/us/podcast/when-strength-becomes-weakness/id1346314086?i=1000436121595&quot;&gt;WorkLife with Adam Grant: When Strength Becomes Weakness&lt;/a&gt;&lt;/p&gt;</content><author><name></name></author><category term="Career" /><summary type="html">In listening to the podcast episode of WorkLife with Adam Grant: When Strength Becomes Weakness, I thought about two different situations in my career that related to the two topics discussed. The episode discusses the idea of improving your weaknesses versus fostering your strengths. It posits that people spend too much time focusing on their weaknesses and not enough time on fostering their strengths. I agree with this notion and the following are two stories from my career that come to mind.</summary></entry><entry><title type="html">Using OCLint Without Rebuilding Your Project</title><link href="https://thisiskyle.me/posts/using-oclint-without-rebuilding-your-project.html" rel="alternate" type="text/html" title="Using OCLint Without Rebuilding Your Project" /><published>2018-12-17T00:00:00+00:00</published><updated>2018-12-17T00:00:00+00:00</updated><id>https://thisiskyle.me/posts/using-oclint-without-rebuilding-your-project</id><content type="html" xml:base="https://thisiskyle.me/posts/using-oclint-without-rebuilding-your-project.html">&lt;h2 id=&quot;overview&quot;&gt;Overview&lt;/h2&gt;
&lt;p&gt;For those of you still using Objective-C in your iOS projects, &lt;a href=&quot;http://oclint.org/&quot;&gt;OCLint&lt;/a&gt; is a &lt;a href=&quot;https://en.wikipedia.org/wiki/Lint_(software)&quot;&gt;linter&lt;/a&gt; for Objective-C that is often stated as the best. If you go through the standard steps to setup OCLint from a tutorial or on their site, they will instruct you to build your app separately with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xcodebuild&lt;/code&gt; in order to run OCLint on your project. This means that if you build in Xcode, you’d have to build it twice. I didn’t want to double our build time in order to be able to even run OCLint, so I decided to see if I could figure out how to avoid this requirement.&lt;/p&gt;

&lt;p&gt;Before we go any further, I want to let you know upfront that I didn’t get to a fully working solution. This article is about my process and showing the trade-offs I made and how far I was able to get. There is still a mostly working solution by the end. I encourage you to read on.&lt;/p&gt;

&lt;p&gt;You can also download my finished scripts &lt;a href=&quot;https://gist.github.com/drumnkyle/b4328e7447b63af88e6f9a9daecc918d&quot;&gt;at this gist&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;finding-a-solution&quot;&gt;Finding a Solution&lt;/h2&gt;
&lt;p&gt;I investigated what OCLint needed to run. It simply took the build log of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xcodebuild&lt;/code&gt;, ran it through &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xcpretty&lt;/code&gt;, and used it as input. I figured Xcode must generate the same output as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xcodebuild&lt;/code&gt;. My plan was to find where Xcode stored the log, get that file, and run it through &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xcpretty&lt;/code&gt; the same way &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xcodebuild&lt;/code&gt;’s output is run before sending it along to OCLint via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;oclint-json-compilation-database&lt;/code&gt;, which will run OCLint on your project.&lt;/p&gt;

&lt;h3 id=&quot;using-the-xcode-log&quot;&gt;Using the Xcode Log&lt;/h3&gt;
&lt;p&gt;I looked around in the Derived Data folder since that is where all of the build related files are stored. I found a folder named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Logs&lt;/code&gt; with a subfolder named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Build&lt;/code&gt;. There you will find multiple folders named with a random UUID. However, you know that the most recently modified file will be the one you want since you will be running this right after your build finishes.&lt;/p&gt;

&lt;p&gt;The file type is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xcactivitylog&lt;/code&gt;. So, I googled a bit for this and found a &lt;a href=&quot;https://michele.io/test-logs-in-xcode/&quot;&gt;helpful article from Michele Titolo&lt;/a&gt;. The file is actually a gzip of the log. So, I renamed it to have the extension &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gzip&lt;/code&gt;. Double-clicking it gave me another file that I then tried changing to a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.log&lt;/code&gt; file extension. This worked! I then found &lt;a href=&quot;http://joemburgess.com/2014/10/04/diving-into-xcode-logs/&quot;&gt;another article by Joe Burgess&lt;/a&gt; that confirmed they had gone through a similar process, though for a different reason.&lt;/p&gt;

&lt;p&gt;Now, I needed to run this file through &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xcpretty&lt;/code&gt;. Surprisingly, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xcpretty&lt;/code&gt; took several hours to run to completion. I then looked and saw this was a 2MB file. Apparently &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xcpretty&lt;/code&gt; was not optimized for processing a large file. I seemed to hit a dead end.&lt;/p&gt;

&lt;h3 id=&quot;using-a-deprecated-tool&quot;&gt;Using a Deprecated Tool&lt;/h3&gt;
&lt;p&gt;Just when all hope seemed lost, I found a deprecated tool in OCLint called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;oclint-xcodebuild&lt;/code&gt;. This tool was meant to take an xcodebuild.log file and turn it into a JSON file for use by OCLint. Though it was no longer maintained, I figured I’d try it and see if it worked on my file. So, I renamed my file to the expected &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;xcodebuild.log&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;This didn’t work at all. However, I quickly found that it was because the &lt;a href=&quot;https://confluence.qps.nl/fledermaus/questions-answers/other/differences-in-end-of-line-characters-mac-windows-and-linux&quot;&gt;line endings&lt;/a&gt; were classic Mac style instead of the needed Unix style. So, I opened the file in Sublime Text and converted the line endings just to test if it would work. To my surprise, it ran extremely quickly and output the expected &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;compile_commands.json&lt;/code&gt; file.&lt;/p&gt;

&lt;h3 id=&quot;oclint-error&quot;&gt;OCLint Error&lt;/h3&gt;
&lt;p&gt;When I tried to finally run this file using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;oclint-json-compilation-database&lt;/code&gt; command, it failed with the following error:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;oclint: error: one compiler command contains multiple jobs&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I googled this error and found &lt;a href=&quot;https://github.com/oclint/oclint/issues/462&quot;&gt;this issue on the OCLint Github.&lt;/a&gt;I tried setting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;COMPILER_INDEX_STORE_ENABLE&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NO&lt;/code&gt; as was suggested. This worked, but when I looked into what this flag did, it would not be great for the developer experience when using Swift; this disabled indexing while building.&lt;/p&gt;

&lt;p&gt;So, I diffed the JSON file with the flag on and off to see what the differences were. I found the following line was present when the flag was not set to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YES&lt;/code&gt;:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;-index-store-path /Users/ksherman/Library/Developer/Xcode/DerivedData/&amp;lt;project-directory&amp;gt;/Index/DataStore&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To test if this was the only issue, I simply did a find/replace to remove that text anywhere in the file. This worked! This is definitely quite a hack that is likely necessary because this particular OCLint tool is deprecated. In this case, I felt it was worth using this hack as this is a tool and will not affect our users if it breaks.&lt;/p&gt;

&lt;h2 id=&quot;scripting-the-solution&quot;&gt;Scripting the Solution&lt;/h2&gt;
&lt;p&gt;I want to be able to run this process from a script within Xcode. This way I can run it on every build and show errors and warnings inline within the Xcode interface.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you’d like to skip to downloading the scripts I made, I have posted them &lt;a href=&quot;https://gist.github.com/drumnkyle/b4328e7447b63af88e6f9a9daecc918d&quot;&gt;in a gist here&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;First, I needed to find where the logs were stored from the script. I knew that the build system provided different environment variables that give you information and paths that are useful. I found&lt;a href=&quot;https://help.apple.com/xcode/mac/8.0/#/itcaec37c2a6&quot;&gt;this link&lt;/a&gt;that lists all the different environment variables available.  I searched through this list for the best candidate: I found &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUILD_DIR&lt;/code&gt; to be the closest path.&lt;/p&gt;

&lt;p&gt;I then needed to find the right log file, so I used the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ls&lt;/code&gt; command to list the files with the options &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-t1&lt;/code&gt;. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;t&lt;/code&gt; sorts them by last modified and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt; shows one line at a time so I can extract the path I need.&lt;/p&gt;

&lt;p&gt;I needed to convert the line endings with a command line tool. The fastest way I found to do that was the following command:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;tr&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'\r'&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'\n'&lt;/span&gt; &amp;lt; inputFile &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; xcodebuild.log
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I wanted to write a Swift script as it’s faster for me to write code in Swift than Bash since I’m not very well-versed in Bash scripting. So, you’ll find that my scripts are split between the 2 types.&lt;/p&gt;

&lt;p&gt;Feel free to explore the scripts. I also left code in there to help with debugging issues. I’m not extremely proud of the quality of the code, but it does its job.&lt;/p&gt;

&lt;h2 id=&quot;uncovering-a-big-problem&quot;&gt;Uncovering a Big Problem&lt;/h2&gt;
&lt;p&gt;I thought I had done it; it was working! But then, I ran it in our CI builds using Jenkins and it failed. This is when I realized it was always failing after a clean build. This was because the log file was not written to the directory until after the build completes. The build doesn’t actually finish until all of the Run Script phases had finished.&lt;/p&gt;

&lt;p&gt;This means that my script was always operating on the build log of the previous build. I needed to execute my script after the build was done, but I couldn’t find any way to do this using Xcode options.&lt;/p&gt;

&lt;h2 id=&quot;a-workaround-that-only-slightly-works&quot;&gt;A Workaround That Only Slightly Works&lt;/h2&gt;
&lt;p&gt;I was about to call it quits and just say we wouldn’t have OCLint for our builds. I came up with one final idea: I could background the task so that the build would finish before my script started.&lt;/p&gt;

&lt;p&gt;The biggest problem with this solution is that I could not find a way to report the errors in Xcode from the backgrounded script. I decided to just make it work enough so I could claim some victory and not have this all be a waste of time. I made my script output the results to a file that I added to the Xcode project. Every time my script ran, it would delete that file. This means you at least get the visual indication of red text for the file name in Xcode when the script starts because the file is missing. Then, the text will change back to the standard black color (in light mode) once the script finishes. You can then just read the results.&lt;/p&gt;

&lt;p&gt;To accomplish this, I added the following as a Run Script in Xcode:&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; ~/.bash_profile
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; &amp;lt;path to oclint scripts&amp;gt;
&lt;span class=&quot;nb&quot;&gt;nohup&lt;/span&gt; ./run_oclint.sh &lt;span class=&quot;nt&quot;&gt;-b&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;BUILD_DIR&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PROJECT_DIR&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/oclint_exclusions &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PROJECT_DIR&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PROJECT_DIR&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &amp;amp;&amp;gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;BUILD_DIR&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;/oclint_output.log &amp;amp;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;a-call-for-help&quot;&gt;A Call for Help&lt;/h2&gt;
&lt;p&gt;This is as far as I got. I’m posting this to show my complete process so that others can learn from it. I’m also hoping maybe someone will read this and have an idea.&lt;/p&gt;

&lt;p&gt;I hope this will also encourage others to post stories of their development that didn’t quite work out. Whether we are early in our career as a developer or very experienced, we all have problems for which we just aren’t able to find a good solution. In my opinion, these stories are important to hear about, just like the successes.&lt;/p&gt;

&lt;p&gt;Again, you can download &lt;a href=&quot;https://gist.github.com/drumnkyle/b4328e7447b63af88e6f9a9daecc918d&quot;&gt;all my scripts at this gist&lt;/a&gt;.&lt;/p&gt;</content><author><name></name></author><category term="Software Development" /><summary type="html">Overview For those of you still using Objective-C in your iOS projects, OCLint is a linter for Objective-C that is often stated as the best. If you go through the standard steps to setup OCLint from a tutorial or on their site, they will instruct you to build your app separately with xcodebuild in order to run OCLint on your project. This means that if you build in Xcode, you’d have to build it twice. I didn’t want to double our build time in order to be able to even run OCLint, so I decided to see if I could figure out how to avoid this requirement.</summary></entry><entry><title type="html">Measuring iOS scroll performance is tough. Use this to make it simple &amp;amp; automated</title><link href="https://thisiskyle.me/posts/measuring-ios-scroll-performance-is-tough-use-this-to-make-it-simple-and-automated.html" rel="alternate" type="text/html" title="Measuring iOS scroll performance is tough. Use this to make it simple &amp;amp; automated" /><published>2018-08-28T00:00:00+00:00</published><updated>2018-08-28T00:00:00+00:00</updated><id>https://thisiskyle.me/posts/measuring-ios-scroll-performance-is-tough--use-this-to-make-it-simple-and-automated</id><content type="html" xml:base="https://thisiskyle.me/posts/measuring-ios-scroll-performance-is-tough-use-this-to-make-it-simple-and-automated.html">&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;iOS Developers who want to create the best experience strive to have a buttery smooth 60 frames-per-second scrolling. There’s nothing more frustrating — both for the user and developer — than having the UI stutter while scrolling. It breaks the illusion of a fluid interface that responds to your every gesture. But now there is an easy way for developers to ensure that scrolling is always nice and smooth. Historically, analyzing scroll performance has been a tedious, manual process that is hard to measure precisely. This process usually involves manually running Instruments on a device, which requires building for profiling (longer build time) and observing the frame rate manually.&lt;/p&gt;

&lt;p&gt;I would like to introduce automated scroll performance testing. An important note is that you will need to run these types of tests on a physical device; running on the simulator will not give accurate numbers. In order to get the best data, you should run on an older, slower device that you support to ensure the performance is adequate.&lt;/p&gt;

&lt;h2 id=&quot;analyzing-scroll-performance&quot;&gt;Analyzing Scroll Performance&lt;/h2&gt;
&lt;p&gt;I spent a long time analyzing scroll performance and looking at different numbers to understand what criteria can be used to judge the scroll performance of a view controller. The average frame rate is not fine-grained enough to use as a specific measure.&lt;/p&gt;

&lt;p&gt;I came up with two metrics that should never exceed a certain threshold. These two numbers combined give you the best picture of scroll performance:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Number of dropped frames at any instant&lt;/li&gt;
  &lt;li&gt;Number of times a frame drop event occurs during a single scroll event
A large number of frames dropped at a single instant will cause a very noticeable stop in the fluidity of the interface. Too many frame drop events during one scroll will make it seem like the whole scroll event is sluggish even if the number of frames dropped at a time is small. These limits can change based on expectations of scroll performance and the type of views being measured.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;frame-rate-reporter&quot;&gt;Frame Rate Reporter&lt;/h2&gt;
&lt;p&gt;Below you will see the code for the class that monitors the frame rate and communicates it back to your code. Don’t be afraid of all the Objective-C code in this article. Everything can be used from Swift. The code hooks into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CADisplayLink&lt;/code&gt; in order to do this. Using the duration of a frame, we compare the current and previous timestamps and divide by the duration to get the number of frames. Using this information, we can calculate how many frames were dropped. We also keep a running count of how many frames were dropped. These values can be reset at any time.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/drumnkyle/89180f310d705df75647e45dc5f8fd59.js&quot;&gt;&lt;/script&gt;

&lt;h2 id=&quot;ways-to-run-your-test&quot;&gt;Ways To Run Your Test&lt;/h2&gt;
&lt;p&gt;You can use this class and the associated delegate to either run tests in an automated fashion or run the detector while using your debug app to collect information. You can also choose both.&lt;/p&gt;

&lt;p&gt;Other factors can influence your scroll performance that is outside the control of your app. It is important to ensure that there are not many background tasks using up the CPU and GPU while you are running your test. The code below gives you the current CPU and GPU activity. I borrowed this from code that my previous coworker, &lt;a href=&quot;https://www.linkedin.com/in/benjaminwhendricks/&quot;&gt;Benjamin Hendricks&lt;/a&gt;. You can use this to check the activity before each test to ensure a reasonable baseline that will not skew your results.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/drumnkyle/e011bdb3c1419a240788a0cbbbbcc9ce.js&quot;&gt;&lt;/script&gt;

&lt;h3 id=&quot;ui-tests&quot;&gt;UI Tests&lt;/h3&gt;
&lt;p&gt;For UI tests, you need a method that reliably scrolls at a steady speed. A fast scroll may cause certain optimizations in things like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UICollectionView&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UITableView&lt;/code&gt;. Also, you need to know when you have reached the end of the scroll view. I tried using both &lt;a href=&quot;https://github.com/kif-framework/KIF&quot;&gt;KIF&lt;/a&gt; and XCUITest for this purpose. Unfortunately, XCUITest did not allow me to control the speed. I also could not reliably detect when we hit the bottom of the list. Therefore, KIF was my chosen framework. You can use KIF to scroll through a view until it hits the bottom. As you see in the code below, we reset the counts of the frame rate reporter after each scroll is finished.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/drumnkyle/28759b11628eac860e77fb1297cdc7e9.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;In the GIF below you can see what the test looks like when it runs. We are measuring the frame drops from the time a scroll starts until it ends (comes to rest). Then, we reset the counts and measure on the next scroll event. Using this method, we can know exactly when it fails if it does.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/scroll-perf-lo-fi.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;while-running-debug-builds&quot;&gt;While Running Debug Builds&lt;/h3&gt;
&lt;p&gt;You can also use the frame rate reporter in your app code. The code should be safe to run for production apps and should be able to make it through app review as no private APIs are being used. Therefore, you could set it up to log any time your frame drop limits are hit. Or, you could just run it in debug builds and assert if your limits are hit. I’d love to hear about the ways you use it for your app.&lt;/p&gt;

&lt;h2 id=&quot;writing-your-test&quot;&gt;Writing Your Test&lt;/h2&gt;
&lt;p&gt;You can use this framework to test the scroll performance of two different kinds of elements: a view controller’s view, or a single UI component. Measuring scroll performance at a view controller level will quickly verify that the interaction of many different components will not cause any scroll performance degradation. However, if you are building a shared component for use throughout your app, you can catch any issues early on if you test that single component in isolation.&lt;/p&gt;

&lt;h3 id=&quot;kif&quot;&gt;KIF&lt;/h3&gt;
&lt;p&gt;In order to write an automated UI test to test scroll performance, you need to set up a test app. If you are testing your app’s view controllers, you will want to ensure you have accessibility identifiers for the controls that will take you to the correct view to test. Also, you’ll need an accessibility identifier on the table or collection view to scroll. If you want to test single views in isolation, you should create a separate test app and create a collection view or table view with many different versions of that view. You will see an easy way to create this in the next section.&lt;/p&gt;

&lt;h3 id=&quot;layouttest&quot;&gt;LayoutTest&lt;/h3&gt;
&lt;p&gt;In order to ensure optimizations of classes like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UICollectionView&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UITableView&lt;/code&gt; are not triggered, you want to make sure that your rows have different data and/or configurations. A great way to ensure this is to use a library called &lt;a href=&quot;https://github.com/linkedin/LayoutTest-iOS&quot;&gt;LayoutTest&lt;/a&gt;. If you haven’t seen this library, please take a look at what it does. I am a huge fan of this library and was working with the author, &lt;a href=&quot;https://www.linkedin.com/in/pdlivesey/&quot;&gt;Peter Livesey&lt;/a&gt; when he was building it. The specific feature of LayoutTest I suggest using for your scroll performance tests is called &lt;a href=&quot;https://linkedin.github.io/LayoutTest-iOS/pages/060_catalog.html&quot;&gt;Catalog&lt;/a&gt;. You can learn more about this feature and how to use it by watching &lt;a href=&quot;https://www.linkedin.com/learning/learning-layouttest-for-ios-development/using-catalog-view&quot;&gt;this video&lt;/a&gt; from &lt;a href=&quot;https://www.linkedin.com/learning/learning-layouttest-for-ios-development/&quot;&gt;my course on LinkedIn Learning&lt;/a&gt; on LayoutTest.&lt;/p&gt;

&lt;p&gt;LayoutTest’s Catalog feature can be used to write a scroll performance test for a single view like a custom button, a particular type of cell, etc. The Catalog feature creates a view controller with every possible combination of specifications for that view very easily. The result is a perfect sample test app with a long, scrolling view of all of the different ways this view can be laid out. Every edge case of your layout will be tested to ensure it doesn’t degrade scroll performance.&lt;/p&gt;

&lt;h2 id=&quot;thanks&quot;&gt;Thanks&lt;/h2&gt;
&lt;p&gt;Special thanks to &lt;a href=&quot;https://www.linkedin.com/in/benjaminwhendricks/&quot;&gt;Benjamin Hendricks&lt;/a&gt; for writing the code that was the basis for this project. Also, special thanks to &lt;a href=&quot;https://www.linkedin.com/in/pdlivesey/&quot;&gt;Peter Livesey&lt;/a&gt; for creating the awesome LayoutTest library that continues to be extremely useful.&lt;/p&gt;

&lt;p&gt;I hope you can use this code to help you improve the performance and user experience of your apps! Please let me know your experience by visiting the Contact page of my site.&lt;/p&gt;

&lt;p&gt;You can see a gist with all of the code from this article &lt;a href=&quot;https://gist.github.com/drumnkyle/37665e4534cd5b7609d7b4592b10b603&quot;&gt;here&lt;/a&gt;. Please feel free to use it as is in your own projects.&lt;/p&gt;</content><author><name></name></author><category term="Software Development" /><summary type="html">Introduction iOS Developers who want to create the best experience strive to have a buttery smooth 60 frames-per-second scrolling. There’s nothing more frustrating — both for the user and developer — than having the UI stutter while scrolling. It breaks the illusion of a fluid interface that responds to your every gesture. But now there is an easy way for developers to ensure that scrolling is always nice and smooth. Historically, analyzing scroll performance has been a tedious, manual process that is hard to measure precisely. This process usually involves manually running Instruments on a device, which requires building for profiling (longer build time) and observing the frame rate manually.</summary></entry><entry><title type="html">Working All Day Hurts; Should I Go to a Doctor?</title><link href="https://thisiskyle.me/posts/working-all-day-hurts-should-i-go-to-a-doctor.html" rel="alternate" type="text/html" title="Working All Day Hurts; Should I Go to a Doctor?" /><published>2018-02-16T00:00:00+00:00</published><updated>2018-02-16T00:00:00+00:00</updated><id>https://thisiskyle.me/posts/working-all-day-hurts--should-i-go-to-a-doctor</id><content type="html" xml:base="https://thisiskyle.me/posts/working-all-day-hurts-should-i-go-to-a-doctor.html">&lt;p&gt;The spine houses the spinal cord, which is the central nervous system of the body. The central nervous system controls all other systems of the body. This means it controls the functions of all your other organs like your heart, liver, glands, etc. Therefore, if there is a problem with the central nervous system it can manifest itself as symptoms all throughout your body.&lt;/p&gt;

&lt;p&gt;Problems in the central nervous system occur very often when your spine is misaligned. These can be large misalignments, like &lt;a href=&quot;https://en.wikipedia.org/wiki/Scoliosis&quot;&gt;scoliosis&lt;/a&gt;, which many may have heard of, however they can be partial misalignments of bones (vertebrae) in the spine; this is called a &lt;a href=&quot;http://www.chiropractic.org/subluxations&quot;&gt;subluxation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When a subluxation occurs, it can cause the spinal cord to send incorrect messages throughout the body. This results in all different types of symptoms from headaches to dizziness to stomach problems and more aside from the standard neck or back ache that will likely accompany it over time.&lt;/p&gt;

&lt;p&gt;Subluxations in the spine manifest outwardly as postural issues. If your bones are not aligned properly, you will not be standing as straight or tall as you should. Issues with your posture can cause the subluxations, but also a subluxation could be caused other stress factors, including an accident or other trauma. The main idea here is that not all issues with your neck and back are posture related, however some may be. It’s important to ensure you do what you can to have proper posture and ergonomics, but sometimes underlying issues must be fixed to allow you to have good posture.&lt;/p&gt;

&lt;p&gt;There are plenty of healthy things you can do to lessen symptoms and correct posture. People often turn to Yoga to improve flexibility and strength as well as physical therapy for similar reasons. Though these practices are definitely very healthy and helpful, the only way to correct these subluxations in your spine is to see a chiropractor. A chiropractor specializes in solving these types of issues.&lt;/p&gt;

&lt;p&gt;A chiropractor works to correct subluxations in the spine. Different chiropractors have varying techniques but they often boil down to manual adjustments of your neck and spine. Chiropractors can also adjust different joints in your extremities (ankles, wrists, etc). By making these adjustments the chiropractor gently moves the bones back into better alignment so that pressure on the nervous system is reduced. It is almost always painless and is non-invasive. Similar to wearing braces, it takes time and consistent adjustments to fix the problems in the long run.&lt;/p&gt;

&lt;p&gt;Not only do you need to see a chiropractor regularly, but also it’s important to make certain changes in your life to ensure that adjustments hold, and your spine stays in better alignment. I will detail some of these changes in subsequent articles, especially as they relate to working at a computer (ergonomics). By making these changes, you will need to see a chiropractor less frequently and will be much healthier overall. One thing is for sure, it is definitely a good idea to go see a chiropractor no matter who you are, especially if you work at a computer. The longer you wait, the harder it is to fix these issues.&lt;/p&gt;</content><author><name></name></author><category term="Ergonomics" /><summary type="html">The spine houses the spinal cord, which is the central nervous system of the body. The central nervous system controls all other systems of the body. This means it controls the functions of all your other organs like your heart, liver, glands, etc. Therefore, if there is a problem with the central nervous system it can manifest itself as symptoms all throughout your body.</summary></entry><entry><title type="html">Backpacks</title><link href="https://thisiskyle.me/posts/backpacks.html" rel="alternate" type="text/html" title="Backpacks" /><published>2018-01-22T00:00:00+00:00</published><updated>2018-01-22T00:00:00+00:00</updated><id>https://thisiskyle.me/posts/backpacks</id><content type="html" xml:base="https://thisiskyle.me/posts/backpacks.html">&lt;p&gt;I very much enjoy having anything I may need accessible to me at all times. I carry with me many different items that I may need every day. Therefore, for most of my life, I have worn cargo shorts. Over the years, I have limited what I carry in my cargo shorts, but I never could get it down to a small enough set where I wouldn’t need the cargo pockets. After much prodding from my wife and others, as well as my own realization about the dated and unrefined look of cargo shorts, I decided to go on a mission to see if I could stop wearing cargo shorts and switch to shorts with standard pockets.&lt;/p&gt;

&lt;p&gt;I decided that the best way was to have a bag that I brought with me everywhere with all of the things I need. This bag would have to not be too heavy as I would be wearing it all the time.&lt;/p&gt;

&lt;h2 id=&quot;alternatives-considered&quot;&gt;Alternatives Considered&lt;/h2&gt;
&lt;h3 id=&quot;messenger-bag&quot;&gt;Messenger Bag&lt;/h3&gt;
&lt;p&gt;I thought about a messenger bag, but any bag with a single strap is not an option, because if you have weight on one shoulder, you are throwing off your posture, thereby creating health problems. This is an issue for women using purses. The best you can do, if unwilling to go with a backpack, is to switch which shoulder your carry the bag with regularly. I wanted to make sure I wouldn’t have this problem, therefore I limited my search to a standard 2 shoulder strap backpack.&lt;/p&gt;

&lt;h3 id=&quot;jacket&quot;&gt;Jacket&lt;/h3&gt;
&lt;p&gt;I have purchased many items from &lt;a href=&quot;https://www.scottevest.com/&quot;&gt;SCOTTeVEST&lt;/a&gt;, because of their multitude of pockets. If you haven’t checked it out, I highly recommend it. They even have clothes for women with many pockets. I wore one of their jackets, the &lt;a href=&quot;https://www.scottevest.com/v3_store/Tropiformer_Jacket.shtml&quot;&gt;Tropiformer&lt;/a&gt;, every day in many different types of weather. I even created a &lt;a href=&quot;https://youtu.be/l5cLlt5CP8k&quot;&gt;video review&lt;/a&gt; of the product that is also comedic. However, it becomes dirty quickly which makes it difficult to remove everything and wash it frequently. Also, I tend to be hot very often, so always wearing a jacket was not a great option.&lt;/p&gt;

&lt;h2 id=&quot;backpack-criteria&quot;&gt;Backpack Criteria&lt;/h2&gt;
&lt;p&gt;I decided I would go with a backpack. Here is the criteria I had for the bag:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Look: Clean, mature, slim&lt;/li&gt;
  &lt;li&gt;Padded straps&lt;/li&gt;
  &lt;li&gt;Ergonomically designed&lt;/li&gt;
  &lt;li&gt;Chest strap (optional)&lt;/li&gt;
  &lt;li&gt;Quick access&lt;/li&gt;
  &lt;li&gt;Good organization&lt;/li&gt;
  &lt;li&gt;Needs to fit 15” MacBook Pro&lt;/li&gt;
  &lt;li&gt;Hopefully a pocket or 2 that can be accessed while wearing it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I researched many different brands and started at a very cheap price point, but ended up finding better bags at a higher price point. I extensively searched through all the models in the following brands: Swissgear, Chrome, Thule, Herschel, Incase, and some others. In the end, I found the best combination at Incase. For a cheaper alternative, I was very much considering trying &lt;a href=&quot;www.swissgear.com&quot;&gt;Swissgear&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;winning-brand-incase&quot;&gt;Winning Brand: Incase&lt;/h2&gt;
&lt;p&gt;I knew that I liked Incase the best as it had the nicest look (my wife agreed), it met all my criteria, and I knew the quality of the brand well from other products I had bought as protection for my Apple products years ago. Next, I had to pick a model. I narrowed it down to 5. Here is my breakdown of each model:&lt;/p&gt;

&lt;h3 id=&quot;icon-backpack&quot;&gt;&lt;a href=&quot;https://www.incase.com/products/travel/backpacks/icon-backpack&quot;&gt;Icon Backpack&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;$200&lt;/em&gt;
&lt;img src=&quot;/images/icon-backpack-blk_05_1.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4 id=&quot;pros&quot;&gt;Pros&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Holds a ton of stuff&lt;/li&gt;
  &lt;li&gt;Stands up by itself&lt;/li&gt;
  &lt;li&gt;Has 2 side, quick-access pockets&lt;/li&gt;
  &lt;li&gt;Separate iPad and Laptop compartments&lt;/li&gt;
  &lt;li&gt;Chest strap&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;cons&quot;&gt;Cons&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Price&lt;/li&gt;
  &lt;li&gt;A little too big?&lt;/li&gt;
  &lt;li&gt;The look is good, but not fantastic&lt;/li&gt;
  &lt;li&gt;No water bottle pocket&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;icon-lite-pack&quot;&gt;&lt;a href=&quot;https://www.incase.com/products/bags/backpacks/icon-lite-backpack&quot;&gt;Icon Lite Pack&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;$100&lt;/em&gt;
&lt;img src=&quot;/images/incase-icon-lite-pack-inco100279-blk-h.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4 id=&quot;pros-1&quot;&gt;Pros&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Stands up by itself&lt;/li&gt;
  &lt;li&gt;Decent Price&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;cons-1&quot;&gt;Cons&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;No chest strap&lt;/li&gt;
  &lt;li&gt;The look is good, but not fantastic&lt;/li&gt;
  &lt;li&gt;No separate laptop pocket&lt;/li&gt;
  &lt;li&gt;No water bottle pocket&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;icon-slim-backpack&quot;&gt;&lt;a href=&quot;https://www.incase.com/icon-slim-backpack&quot;&gt;Icon Slim Backpack&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;$150&lt;/em&gt;
&lt;img src=&quot;/images/incase-icon-slim-laptop-backpack-8.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4 id=&quot;pros-2&quot;&gt;Pros&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Good in-between size&lt;/li&gt;
  &lt;li&gt;Separate laptop compartment&lt;/li&gt;
  &lt;li&gt;Has 2 side, quick-access pockets&lt;/li&gt;
  &lt;li&gt;Stands up by itself&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;cons-2&quot;&gt;Cons&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;The look is good, but not fantastic&lt;/li&gt;
  &lt;li&gt;No water bottle pocket&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;city-backpack&quot;&gt;&lt;a href=&quot;https://www.incase.com/products/bags/backpacks/city-backpack&quot;&gt;City Backpack&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;$130&lt;/em&gt;
&lt;img src=&quot;/images/city-backpack-blk_02.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4 id=&quot;pros-3&quot;&gt;Pros&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Nice, clean look (in product photos)&lt;/li&gt;
  &lt;li&gt;Good in-between size&lt;/li&gt;
  &lt;li&gt;Separate laptop pocket&lt;/li&gt;
  &lt;li&gt;Has 2 side, quick-access pockets&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;cons-3&quot;&gt;Cons&lt;/h4&gt;
&lt;ul&gt;
  &lt;li&gt;Can’t stand up by itself&lt;/li&gt;
  &lt;li&gt;No chest straps&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;city-compact-backpack&quot;&gt;&lt;a href=&quot;https://www.incase.com/products/bags/backpacks/city-compact-backpack&quot;&gt;City Compact Backpack&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;$100&lt;/em&gt;
&lt;img src=&quot;/images/city_compact_backpack-_black-_h.jpg&quot; alt=&quot;&quot; /&gt;
Same as City Backpack except it doesn’t have a separate laptop pocket and no quick access side pockets.&lt;/p&gt;

&lt;h2 id=&quot;winner-incase-icon-backpack&quot;&gt;Winner: &lt;a href=&quot;https://www.incase.com/products/travel/backpacks/icon-backpack&quot;&gt;Incase Icon Backpack&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/images/icon-backpack-blk_expanded.jpg&quot; alt=&quot;&quot; /&gt;
I ended up purchasing the Icon, the Icon Slim, and the City. I thought I would like the look of the City Backpack best, however in person it actually looked kind of dumpy, because it didn’t have much of a shape. The Icon Slim didn’t have enough organization nor space for everything I would want to carry. Therefore, I went with the Icon Backpack even though it was on the expensive side and was a bit big looking. It had the best storage and organization. I have been very happy with it and highly recommend it. The quick access pockets are the best part of the bag. I’m able to access my keys and headphones while still wearing the bag normally. I also happened to find a nice discount code on &lt;a href=&quot;www.retailmenot.com&quot;&gt;RetailMeNot&lt;/a&gt; and bought it from &lt;a href=&quot;www.incase.com&quot;&gt;Incase&lt;/a&gt; directly. I was able to return the other 2 with no problems.&lt;/p&gt;

&lt;p&gt;Good luck in your search!&lt;/p&gt;

&lt;h2 id=&quot;update-after-purchase&quot;&gt;Update After Purchase&lt;/h2&gt;
&lt;p&gt;I have been using the Incase Icon Backpack for quite a while now. I am still very happy with my purchase. There is one downside I wanted to point out. Even though there is a good amount of space and pockets, it is difficult to fit bulkier items like a jacket or other clothes. However, if you unzip all the way it is able to fit much more easily and is not too much of an issue for me.&lt;/p&gt;</content><author><name></name></author><category term="Product Reviews" /><summary type="html">I very much enjoy having anything I may need accessible to me at all times. I carry with me many different items that I may need every day. Therefore, for most of my life, I have worn cargo shorts. Over the years, I have limited what I carry in my cargo shorts, but I never could get it down to a small enough set where I wouldn’t need the cargo pockets. After much prodding from my wife and others, as well as my own realization about the dated and unrefined look of cargo shorts, I decided to go on a mission to see if I could stop wearing cargo shorts and switch to shorts with standard pockets.</summary></entry><entry><title type="html">Big-O Notation</title><link href="https://thisiskyle.me/posts/big-o-notation.html" rel="alternate" type="text/html" title="Big-O Notation" /><published>2017-09-28T00:00:00+00:00</published><updated>2017-09-28T00:00:00+00:00</updated><id>https://thisiskyle.me/posts/big-o-notation</id><content type="html" xml:base="https://thisiskyle.me/posts/big-o-notation.html">&lt;p&gt;I just wanted to share a &lt;a href=&quot;http://pages.cs.wisc.edu/~vernon/cs367/notes/3.COMPLEXITY.html#youtry3&quot;&gt;quick link&lt;/a&gt; with everyone that I believe explains Big-O notation pretty well and has nice little self-tests with solutions. Big-O notation is very necessary for technical phone interviews, but it can also be very helpful when developing solutions in your work. I hope the link above helps you understand Big-O notation better; it helped me when I was learning it.&lt;/p&gt;</content><author><name></name></author><category term="Software Development" /><summary type="html">I just wanted to share a quick link with everyone that I believe explains Big-O notation pretty well and has nice little self-tests with solutions. Big-O notation is very necessary for technical phone interviews, but it can also be very helpful when developing solutions in your work. I hope the link above helps you understand Big-O notation better; it helped me when I was learning it.</summary></entry><entry><title type="html">Apple Watch Bands Review</title><link href="https://thisiskyle.me/posts/apple-watch-bands-review.html" rel="alternate" type="text/html" title="Apple Watch Bands Review" /><published>2015-05-24T00:00:00+00:00</published><updated>2015-05-24T00:00:00+00:00</updated><id>https://thisiskyle.me/posts/apple-watch-bands-review</id><content type="html" xml:base="https://thisiskyle.me/posts/apple-watch-bands-review.html">&lt;p&gt;&lt;strong&gt;tl;dr:&lt;/strong&gt; The Sport Band is the best band in all situations in my opinion.&lt;/p&gt;

&lt;p&gt;I purchased the Stainless Steel WATCH with black Sport Band and have had it since April 29th. On May 20th, I received my Black Leather Loop and on May 21st I received my Milanese Loop. I ordered these other bands so I could try them out and see what I liked best. I wore the Leather &amp;amp; Milanese Loops for one full work day each from morning till bed. After wearing the band for one day each, I feel like my opinion was solidified.&lt;/p&gt;

&lt;p&gt;I will detail my thoughts as an easy Pros and Cons list for each band. These are my opinions based on the experiences I had with the bands along with some feedback from others I asked.&lt;/p&gt;

&lt;h2 id=&quot;leather-loop-black&quot;&gt;Leather Loop (Black)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/images/apple_watch_leather_band.JPG&quot; alt=&quot;Apple Leather Loop (Black)&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;pros&quot;&gt;Pros&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Comfortable&lt;/li&gt;
  &lt;li&gt;Very Adjustable&lt;/li&gt;
  &lt;li&gt;Doesn’t pull arm hair at all&lt;/li&gt;
  &lt;li&gt;It is comfortable when resting my wrist on a surface. I tested this while using a mouse with a wrist pad at work throughout the day.&lt;/li&gt;
  &lt;li&gt;It looks very nice.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;cons&quot;&gt;Cons&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Sits above the wrist and moves back and forth slightly with my arm movement&lt;/li&gt;
  &lt;li&gt;The slight movement can feel like a tap from the Taptic Engine™.&lt;/li&gt;
  &lt;li&gt;The vast adjustability made me constantly fidget with it throughout the day; I could see this becoming an issue for me.&lt;/li&gt;
  &lt;li&gt;I wear my watches tight. Because the band was so adjustable, I was able to make it fit so perfectly that I made it too tight and it left a mark on my wrist.&lt;/li&gt;
  &lt;li&gt;The position of the watch seemed to make the heart rate sensor not work sometimes, though I am unsure if this had to do with the issues people are having in OS version 1.0.1 (&lt;a href=&quot;http://www.macrumors.com/2015/05/22/apple-watch-users-inconsistent-heart-rate-data/&quot;&gt;see article&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;milanese-loop&quot;&gt;Milanese Loop&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/images/apple_watch_milanese_band.JPG&quot; alt=&quot;Apple Milanese Loop&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;pros-1&quot;&gt;Pros&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Many people think it looks nice&lt;/li&gt;
  &lt;li&gt;It is comfortable when wearing it (mostly).&lt;/li&gt;
  &lt;li&gt;It doesn’t come apart in two pieces like most bands, therefore you are not likely to drop the watch while trying to put it on.&lt;/li&gt;
  &lt;li&gt;It is the most adjustable of the bands available.&lt;/li&gt;
  &lt;li&gt;The heart rate sensor seems to work fine with this band on.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;cons-1&quot;&gt;Cons&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Some people who thought it looked great from photos on Apple’s website, thought it didn’t look quite as nice or fancy in person.&lt;/li&gt;
  &lt;li&gt;It would look nicer if it were a bit wider. This is the case especially with the 38mm version.&lt;/li&gt;
  &lt;li&gt;It is not very comfortable when resting your wrist on a surface (using a mouse).&lt;/li&gt;
  &lt;li&gt;When I bend my wrist I can feel the metal dig into my skin a little, and it is not very pleasant.&lt;/li&gt;
  &lt;li&gt;Like the leather loop, it sat above my wrist in a somewhat odd position at times.&lt;/li&gt;
  &lt;li&gt;It seems to rock back and forth slightly on top of my wrist, but I didn’t feel that movement like I did with the Leather Loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;sport-band-black&quot;&gt;Sport Band (Black)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/images/apple_watch_sport_band.JPG&quot; alt=&quot;Apple Sport Band (Black)&quot; /&gt;&lt;/p&gt;
&lt;h3 id=&quot;pros-2&quot;&gt;Pros&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Very good looking. My girlfriend has the white version, and it is very nice looking as well.&lt;/li&gt;
  &lt;li&gt;Extremely comfortable in all positions.&lt;/li&gt;
  &lt;li&gt;Wraps around my wrist best, and the watch stays in one place and doesn’t rock.&lt;/li&gt;
  &lt;li&gt;Can look both casual and fancy.&lt;/li&gt;
  &lt;li&gt;Very smooth and light&lt;/li&gt;
  &lt;li&gt;Can put it on the same setting every time I wear it.&lt;/li&gt;
  &lt;li&gt;Not as much messing with the size, which is helpful if you have a little OCD.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;cons-2&quot;&gt;Cons&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;It can pull your arm hair a little (sometimes).&lt;/li&gt;
  &lt;li&gt;Not as adjustable as other options.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope this article helps you decide which band you would like if you are purchasing an WATCH, or have already purchased one and are thinking about  getting a second band. I will be returning the Leather Loop and Milanese Loop to the Apple Store, but I think that many people will find them quite nice. All in all, I’m very happy Apple focused so much on making such great watch bands. That was always the biggest problem with watches for me.&lt;/p&gt;</content><author><name></name></author><category term="Product Reviews" /><summary type="html">tl;dr: The Sport Band is the best band in all situations in my opinion.</summary></entry><entry><title type="html">30 Second Elevator Pitch</title><link href="https://thisiskyle.me/posts/30-second-elevator-pitch.html" rel="alternate" type="text/html" title="30 Second Elevator Pitch" /><published>2011-08-22T00:00:00+00:00</published><updated>2011-08-22T00:00:00+00:00</updated><id>https://thisiskyle.me/posts/30-second-elevator-pitch</id><content type="html" xml:base="https://thisiskyle.me/posts/30-second-elevator-pitch.html">&lt;p&gt;I have been to countless workshops on networking, resume building, and general job hunt help. Many of these workshops have spent some time on stressing the importance of what was called a “30 second elevator pitch”. I’d like to give a brief description of what this is for those of you who don’t know.&lt;/p&gt;

&lt;p&gt;The 30 second elevator pitch is a short speech that a person should develop that tells a bit about themselves, their prior work experience, and what their immediate goals are for their career (full time job, internship, etc.). While I won’t be taking this time to help you go through the steps to create your elevator pitch (there are plenty of sites for that), I will try to help you utilize this in the best way possible.&lt;/p&gt;

&lt;p&gt;In my experience, the most important thing to think about and practice before even developing your pitch is to practice public speaking or speaking to strangers. For myself, I had much experience with this while working at the Apple Store for 1.5 years. This is an essential skill; being able to walk up to a stranger and strike up a conversation without feeling nervous takes practice. You should find ways to practice this and any other public speaking. I’m sure that you will encounter many opportunities for public speaking throughout your college career, some of which may be mandatory.&lt;/p&gt;

&lt;p&gt;Now, developing your pitch is important. You do want to do as all of these sites say. You are to describe yourself, tell a story, use action words, state what it is you are looking for. But the thing that most sites and people don’t tell you is that this is not a completely one-way conversation. This is where we come to my advice. When developing your pitch, I suggest you find points in your pitch that are good breaking points to give a small pause to let the person to whom you are giving the pitch respond. When you walk up to someone at a career fair or conference you should look at it less like time that you need to tell someone all about yourself, and rather look at it as a conversation during which you persuade someone to be interested in hiring you.&lt;/p&gt;

&lt;p&gt;Successfully making this change to your pitch can be difficult and requires a different skill: reading people. In order to make this effective you must be watching the person you are talking to very closely and try and sense their reaction. One way you can practice this is to try with a friend and think about what topics are very interesting and may prompt a reaction from the recruiter to whom you are speaking. I feel it’s important to not only talk about work experience, school work, and projects. I think that this is a time to tell the recruiter things that aren’t on your resume; things about you personally. When I give my pitch, I usually mention how I was in Marching Band and Pep Band. Upon stating this, I know that I will get some sort of reaction, because this is something that most people don’t say. Usually, this prompts some sort of question from the recruiter about what instrument I played or something to that effect. Sometimes, something like this can establish some common ground between you and the recruiter. I believe it’s important to find something that you can mention that is different and intriguing. It is important to generate genuine interest and having something personal that you can speak about is very good; it separates you from the crowd.&lt;/p&gt;

&lt;p&gt;I hope this helps anyone who is trying to find an internship or full time job. So far, it has helped me! Good luck!&lt;/p&gt;</content><author><name></name></author><category term="Career" /><summary type="html">I have been to countless workshops on networking, resume building, and general job hunt help. Many of these workshops have spent some time on stressing the importance of what was called a “30 second elevator pitch”. I’d like to give a brief description of what this is for those of you who don’t know.</summary></entry></feed>