<?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>Forem: Jennifer Konikowski</title>
    <description>The latest articles on Forem by Jennifer Konikowski (@jennifer).</description>
    <link>https://forem.com/jennifer</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%2F7%2F7ff80981-7ad3-4c82-9423-57480f148fe9.jpg</url>
      <title>Forem: Jennifer Konikowski</title>
      <link>https://forem.com/jennifer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jennifer"/>
    <language>en</language>
    <item>
      <title>Autofixing Variable Case in PHP</title>
      <dc:creator>Jennifer Konikowski</dc:creator>
      <pubDate>Fri, 18 Sep 2020 17:57:40 +0000</pubDate>
      <link>https://forem.com/jennifer/autofixing-variable-case-in-php-58od</link>
      <guid>https://forem.com/jennifer/autofixing-variable-case-in-php-58od</guid>
      <description>&lt;p&gt;I’m currently working on a PHP project that had a mix of camelCase and snake_case for variables and methods. We had recently started using &lt;a href="https://github.com/FriendsOfPHP/PHP-CS-Fixer"&gt;PHP-CS-Fixer&lt;/a&gt; on the project and, unfortunately, there was not an existing rule to make this kind of change. So I decided to write a variable case fixer myself! Now: this is inherently risky. Instance variables in PHP are called using &lt;code&gt;$this-&amp;gt;variableName&lt;/code&gt;, which is really similar to how you call a function. Those could also be defined above the constructor like &lt;code&gt;private $variableName&lt;/code&gt; and that would be fixed with a fixer like this, but any call site would not. So there’s some of the risk 😅. There are also &lt;a href="https://www.php.net/manual/en/reserved.variables.php"&gt;predefined variables&lt;/a&gt; in PHP that we would not want to update. Ok, let’s get started!&lt;/p&gt;

&lt;p&gt;Since I was using an existing project, I did not have to worry about getting each file and was able to trust PHP-CS-Fixer to parse each file and get me the tokens. The hardest part of this was actually figuring out how to pick out the tokens. So all this does is check to see if the token ( smallest block of code) is either of the two &lt;a href="https://www.php.net/manual/en/tokens.php"&gt;variable types&lt;/a&gt; and not in the list of predefined variables.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;foreach ($tokens as $index =&amp;gt; $token) {
  if ((T_VARIABLE === $token-&amp;gt;getId()) || (T_STRING_VARNAME === $token-&amp;gt;getId())) {
    if (in_array($token-&amp;gt;getContent(), $predefinedVariables)) {
      continue;
    }
    $tokens[$index] = new Token([$token-&amp;gt;getId(), $this-&amp;gt;updateVariableCasing($token-&amp;gt;getContent())]);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That is actually the bulk of it! &lt;code&gt;updateVariableCasing&lt;/code&gt; just takes the configuration and then calls whatever function we need (ie &lt;code&gt;camelCase()&lt;/code&gt; if &lt;code&gt;configuration['case']&lt;/code&gt; is equal to &lt;code&gt;camel_case&lt;/code&gt;. The functions to change case were found somewhere on StackOverflow. Overall, this works very well! The only places we ran into problems were where private variables were defined at the top, converted there, but then not converted when called in the code (as &lt;code&gt;$this-&amp;gt;variable_name&lt;/code&gt;). Something to keep in mind if you decide to implement something like this in your project.&lt;/p&gt;

&lt;p&gt;I did put up (a PR to add this rule to PHP-CS-Fixer)[&lt;a href="https://github.com/FriendsOfPHP/PHP-CS-Fixer/pull/5097"&gt;https://github.com/FriendsOfPHP/PHP-CS-Fixer/pull/5097&lt;/a&gt;], but I think they were reluctant to add it since it’s not safe and I don’t have a ton of extra time to keep trying to get it in.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



</description>
      <category>php</category>
      <category>phpcsfixer</category>
      <category>linters</category>
      <category>programming</category>
    </item>
    <item>
      <title>When You Want A Bit More Rainbow In Your VSCode</title>
      <dc:creator>Jennifer Konikowski</dc:creator>
      <pubDate>Tue, 19 May 2020 17:57:39 +0000</pubDate>
      <link>https://forem.com/jennifer/when-you-want-a-bit-more-rainbow-in-your-vscode-10aj</link>
      <guid>https://forem.com/jennifer/when-you-want-a-bit-more-rainbow-in-your-vscode-10aj</guid>
      <description>&lt;p&gt;I decided to give VSCode a chance again and decided, hey, if I'm setting up an editor from scratch, let's make it fun! I searched around and found the following extensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/CoenraadS/Bracket-Pair-Colorizer-2"&gt;Bracket Pair Colorizer 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oderwat/vscode-indent-rainbow"&gt;Indent-Rainbow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/voldemortensen/rainbow-tags"&gt;Rainbow Tags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mechatroner/vscode_rainbow_csv"&gt;Rainbow CSV&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The colors they each defaulted to were... fine. But I needed ✨rainbow✨. So here are my settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"bracket-pair-colorizer-2.colors": [
    "DeepSkyBlue",
    "DodgerBlue",
    "MediumSlateBlue",
    "BlueViolet",
    "MediumVioletRed",
    "DeepPink",
    "Red",
    "DarkOrange",
    "Gold",
    "GreenYellow",
    "LimeGreen",
    "LightSeaGreen",
    "DarkTurquoise"
],    
"rainbowTags.colors": [
    "BlueViolet",
    "MediumVioletRed",
    "DeepPink",
    "Red",
    "DarkOrange",
    "Gold",
    "GreenYellow",
    "LimeGreen",
    "LightSeaGreen",
    "DarkTurquoise",
    "DeepSkyBlue",
    "DodgerBlue",
    "MediumSlateBlue"
],
"indentRainbow.colors": [
    "rgba(0,191,255,0.07)",
    "rgba(30,144,255,0.07)",
    "rgba(123,104,238,0.07)",
    "rgba(138,43,226,0.07)",
    "rgba(199,21,133,0.07)",
    "rgba(255,20,147,0.07)",
    "rgba(255,0,0,0.07)",
    "rgba(255,140,0,0.07)",
    "rgba(255,215,0,0.07)",
    "rgba(173,255,47,0.07)",
    "rgba(50,205,50,0.07)",
    "rgba(32,178,170,0.07)",
    "rgba(0,206,209,0.07)"
],
"editor.tokenColorCustomizations": {
    "textMateRules": [
        {
            "scope": "rainbow1",
            "settings": {
                "foreground": "#0082C8"
            }
        },
        {
            "scope": "keyword.rainbow2",
            "settings": {
                "foreground": "#39afa9",
            }
        },
        {
            "scope": "entity.name.function.rainbow3",
            "settings": {
                "foreground": "#21c761",
            }
        },
        {
            "scope": "comment.rainbow4",
            "settings": {
                "foreground": "#acf35c",
            }
        },
        {
            "scope": "string.rainbow5",
            "settings": {
                "foreground": "#f7ec56"
            }
        },
        {
            "scope": "variable.parameter.rainbow6",
            "settings": {
                "foreground": "#f0ac46",
            }
        },
        {
            "scope": "constant.numeric.rainbow7",
            "settings": {
                "foreground": "#f05e32",
            }
        },
        {
            "scope": "entity.name.type.rainbow8",
            "settings": {
                "foreground": "#ce1919",
            }
        },
        {
            "scope": "markup.bold.rainbow9",
            "settings": {
                "foreground": "#f531cb"
            }
        },
        {
            "scope": "invalid.rainbow10",
            "settings": {
                "foreground": "#8d31f7"
            }
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;End result is this for Bracket Pair Colorizer and Indent Rainbow (Rainbow Tags looks very similar):&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y8f0hlt9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/385yxn5wl3yphg2ymhg6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y8f0hlt9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/385yxn5wl3yphg2ymhg6.png" alt="bracket pair colorizer and indent rainbow"&gt;&lt;/a&gt;&lt;br&gt;
And this is what Rainbow CSV looks like:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DWmV4mqX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/otw0lrnmtljof1o1lx50.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DWmV4mqX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/otw0lrnmtljof1o1lx50.png" alt="rainbow csv"&gt;&lt;/a&gt;&lt;br&gt;
I did try &lt;a href="https://github.com/wk-j/vscode-rainbow-string"&gt;Rainbow String&lt;/a&gt;, which was pretty cool! But it would sometimes rainbowize more than just strings and then I couldn't take advantage of the syntax highlighting. Overall, I can't recommend that one, even though it is pretty fabulous.&lt;/p&gt;

</description>
      <category>texteditor</category>
      <category>vscode</category>
      <category>rainbows</category>
    </item>
    <item>
      <title>Questions To Ask During An Interview</title>
      <dc:creator>Jennifer Konikowski</dc:creator>
      <pubDate>Mon, 18 May 2020 13:09:36 +0000</pubDate>
      <link>https://forem.com/jennifer/questions-to-ask-during-an-interview-3akm</link>
      <guid>https://forem.com/jennifer/questions-to-ask-during-an-interview-3akm</guid>
      <description>&lt;p&gt;I've had a lot of jobs, and, over the years, I've been refining my list of questions to do my best to ensure that the company I'm interviewing at is a good fit for &lt;em&gt;me&lt;/em&gt;. I just went through the job search again, and asking all of these questions helped me determine that &lt;a href="https://www.testdouble.com"&gt;Test Double&lt;/a&gt; was the right place for me. I cannot stress enough the importance of asking questions in the interview. When I was first out of college, it sounded like I needed to ask questions to impress the interviewers. The truth is that interviewing is a two-way street, and asking questions is how you can find out if the company is the right fit for &lt;strong&gt;you&lt;/strong&gt;. Not asking the right questions is how I've ended up at a lot of places that just weren't right for me in the long term.&lt;/p&gt;

&lt;p&gt;I know this is a lot, but most companies have 6+ hours of interviews before an offer. Spread them out among your interviewers. I usually ask 6-10 questions per person. Sometimes I ask the same question multiple times to get different people's viewpoints. You should feel free to either use this list verbatim or use only the questions that are relevant to you and your needs. I also listed additional resources at the bottom. I also keep this list up-to-date &lt;a href="https://github.com/jmkoni/interview-questions"&gt;on Github&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Culture
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;How does the engineering culture differ from the overall company culture?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can you give me an example of a mistake you've made here, and how it was handled?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How often do you pair?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When something goes wrong, how do you handle it? Do devs get shamed for breaking the build?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How are disagreements solved - both technical disagreements and other kinds?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What happens when personalities clash?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How flexible are work hours?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What tools do you use for remote collaboration?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How do they work together and ensure good communication and collaboration?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can you tell me about what I can expect from the interview process?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How many hours do people work in an average week? In your busiest weeks?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How often are there emergencies or times when people have to work extra hours?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Dev Process
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Who sets deadlines and what happens when people fail to meet them?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can you walk me through your development process, from a ticket or task to code on production?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What checks and balances are in place to make sure people don't make big mistakes or repeat mistakes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What is your build process like?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How does this team plan projects and create deadline estimates?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What is the median age that an issue will be open for?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Who is responsible for doing deployment? How often do you deploy?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is there a written roadmap all developers can see? How far into the future does it extend? How closely is it followed?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How often do you have meetings? Are there any scheduled/standing meetings?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What’s your approach to technical debt?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Describe your deployment process – how do you find bugs in your team’s code?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do you have a QA team?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do you have style guides?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How does engineering work get assigned?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How are technical decisions made and communicated?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Would I need to be on call? How often? What is the SLA? How often do people tend to be paged? How often is it a real emergency?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What does your stack look like? What languages/tools/etc. do you use?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What sort of growth is available for senior engineers?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How does your company support the growth of junior engineers?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Soft Skills
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Technical capabilities aside, what soft skills would make someone successful in this role?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Company
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Are there times of the month, quarter, or year when the team is most busy?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tell me a little bit about your team onboarding process.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How is employee performance evaluated?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is there a budget for employee education/training/development/etc.?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is there support for conference attendance?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;What accomplishment are you most proud of since joining the company?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What size is the team?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How many total development teams?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How much vacation do people get? Sick leave? Are they combined or separate?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do people check in when they’re on vacation? How often?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Additional Resources
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.keyvalues.com/culture-queries"&gt;Culture Queries&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.thecut.com/article/questions-to-ask-in-a-job-interview.html"&gt;The Cut: Best Questions to Ask in a Job Interview&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://juliepagano.com/blog/2015/08/15/job-search-retrospective/#interview-questions"&gt;Julie Pagano's Job Search Retrospective&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jvns.ca/blog/2013/12/30/questions-im-asking-in-interviews/"&gt;Julia Evan's Questions I'm Asking In Interviews&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jvns.ca/blog/compensation-questions/"&gt;Julia Evan's Compensation Questions&lt;/a&gt;&lt;/p&gt;

</description>
      <category>interviewing</category>
      <category>questions</category>
      <category>interview</category>
      <category>career</category>
    </item>
    <item>
      <title>Use the JIRA API to Post Tickets to JIRA</title>
      <dc:creator>Jennifer Konikowski</dc:creator>
      <pubDate>Mon, 08 Oct 2018 18:22:01 +0000</pubDate>
      <link>https://forem.com/jennifer/use-the-jira-api-to-post-tickets-to-jira-33ko</link>
      <guid>https://forem.com/jennifer/use-the-jira-api-to-post-tickets-to-jira-33ko</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://www.jenniferkonikowski.com/blog/2018/9/20/use-the-jira-api-to-post-tickets-to-jira"&gt;jmkoni.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A while ago, I built this &lt;a href="https://github.com/jmkoni/sinatra-jira-app"&gt;super basic Sinatra app&lt;/a&gt; to post tickets to JIRA. Here’s the use case: you have non-technical people who are part of your company/team that need to be able to add bugs to JIRA. However, they aren’t putting the right information into the ticket. Here comes this super basic app. To get it running, you just need to update .env with your JIRA username, password, and project key. However, I would recommend changing it to use &lt;a href="https://developer.atlassian.com/server/jira/platform/oauth/"&gt;OAuth&lt;/a&gt;. Right now, the form is very simple and, if you decide to use this, I would highly recommend you update it to ask for whatever information you want. Just don’t forget to update the JSON in sinatra_jira.rb! This application is completely open source - feel free to copy any of it for any reason, whole or partial. Let’s dig in a bit and do a quick overview of how &lt;a href="http://sinatrarb.com/"&gt;Sinatra&lt;/a&gt; works.&lt;/p&gt;

&lt;p&gt;To start off, the Gemfile is minimal. The biggest thing is that I’m using &lt;a href="https://github.com/bkeepers/dotenv"&gt;dotenv&lt;/a&gt;, a super useful gem that helps manage environment variables using .env files. Other than that, rubocop, sinatra, and we are using thin for the server.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The main file (sinatra-jira.rb) contains the routes and the actions. It’s basically a combination of a controller and routes file all in one. The initial get just displays the form and all the work happens in post. Even that is fairly simple though… we just take the field contents and put them in the form that the JIRA API wants.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The form is pretty simple too and really ugly. I would definitely recommend adding some styling and don’t be like me… internal users deserve nice looking apps too! Since the problem I was facing was that I wasn’t getting the right information, I made sure to put examples in the form to increase the chance that I would get the information that I need.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;This is a SUPER basic response. Don’t miss that we are passing key to the response. That is the issue key which, depending on how much your end users use JIRA, might be useful to include.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Hope this was somewhat useful in some way. I’d love to see feedback too!&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>sinatra</category>
      <category>jira</category>
      <category>api</category>
    </item>
    <item>
      <title>Translating Integers Into An English String in Ruby</title>
      <dc:creator>Jennifer Konikowski</dc:creator>
      <pubDate>Wed, 23 May 2018 19:21:41 +0000</pubDate>
      <link>https://forem.com/jennifer/translating-integers-into-an-english-string-in-ruby-3c9h</link>
      <guid>https://forem.com/jennifer/translating-integers-into-an-english-string-in-ruby-3c9h</guid>
      <description>&lt;p&gt;I'm a huge dork. I was fiddling around on &lt;a href="https://repl.it"&gt;repl.it&lt;/a&gt; to see if I could use it in next year's AP CS class (hey go volunteer with &lt;a href="https://tealsk12.org"&gt;TEALS&lt;/a&gt;!) and I stumbled upon &lt;a href="https://repl.it/@jmkoni/englishnumberold"&gt;this script&lt;/a&gt; from a year ago. Don't judge me too harshly! I don't even know what I was doing or why. After seeing the state it was in, I could not leave it alone. And apparently, I am in a better headspace now because I was able to refactor it fairly quickly and get it into a &lt;a href="https://repl.it/@jmkoni/Englishnumber"&gt;much better state&lt;/a&gt;. I did this heavily utilizing constants and recursion, but I'd be interested to see how others would solve this.&lt;/p&gt;

&lt;p&gt;Here is the code if you don't want to bother with the repls:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


</description>
      <category>discuss</category>
      <category>ruby</category>
    </item>
    <item>
      <title>Cookie Authentication with Scalatra and JWTs</title>
      <dc:creator>Jennifer Konikowski</dc:creator>
      <pubDate>Wed, 02 May 2018 15:56:25 +0000</pubDate>
      <link>https://forem.com/jennifer/cookie-authentication-with-scalatra-and-jwts-beg</link>
      <guid>https://forem.com/jennifer/cookie-authentication-with-scalatra-and-jwts-beg</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://www.jenniferkonikowski.com/blog/2018/5/2/cookie-authentication-using-scalatra-and-jwts" rel="noopener noreferrer"&gt;jmkoni.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As part of my work with &lt;a href="https://arcadia.io" rel="noopener noreferrer"&gt;Arcadia&lt;/a&gt;, I've built a Rails application that added a cookie that contains a &lt;a href="https://jwt.io/" rel="noopener noreferrer"&gt;JWT&lt;/a&gt; (pronounced jot). Great! That was fairly simple. Then I had to go over to our Scala application and get it to accept the JWT as identification. Right now, we were keeping it pretty simple and we only care if it's valid. This post will cover what I think is the simplest way to do that, from start to finish. Or you can skip all that and just go look at the &lt;a href="https://gist.github.com/jmkoni/0b1c807f014f8d6f4fc8abe442b0161d" rel="noopener noreferrer"&gt;full gist&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We want to start off with the JWT parsing. And before we add the code to actually do that, let's add some tests! I decided to use the &lt;a href="http://pauldijou.fr/jwt-scala/" rel="noopener noreferrer"&gt;JWT Scala library&lt;/a&gt; and, in particular, &lt;a href="http://pauldijou.fr/jwt-scala/samples/jwt-core/" rel="noopener noreferrer"&gt;jwt-core&lt;/a&gt;. It had, in my opinion, the most easy-to-understand documentation so I could indeed RTFM and get my work done. Since I didn't need to add encoding in the actual application (the tokens would be encoded in another application), I added a quick line to encode a token within the tests.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Now that I have my tests, let's add the actual code to decode the JWT! Thanks to JWT Scala, this is pretty simple! The real secret sauce is in this line: &lt;code&gt;userTokenData = parse(decoded).extract[Token].data&lt;/code&gt;. That does a lot of heavy lifting! &lt;code&gt;decoded&lt;/code&gt; is just a string and parse turns it into this &lt;code&gt;Jvalue&lt;/code&gt; object thanks to json4s, but that object is a bit hard to work with. However, I can extract it out to my case class, &lt;code&gt;Token&lt;/code&gt;, which is downright magical. If it doesn't include all the fields that I have in &lt;code&gt;Token&lt;/code&gt;, it will produce an error. Perfect!&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Next I need a reusable &lt;code&gt;Authentication&lt;/code&gt; object. This wasn't too bad because I found out that &lt;code&gt;HttpServletRequest&lt;/code&gt; has a method called &lt;code&gt;getCookies&lt;/code&gt; which... returns the cookies. Excellent. I'm sure this looks weird as an &lt;code&gt;Either&lt;/code&gt;, but in this case I really did want &lt;code&gt;Some&lt;/code&gt; or &lt;code&gt;None&lt;/code&gt; because I didn't care about returning the error to the actual user. I did want to log it though, hence the liberal use of &lt;code&gt;println&lt;/code&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Last, but definitely not least, I need a servlet. Well... tests for the servlet, then the servlet 😛. This is where I actually ran into trouble because I wasn't sure how to pass cookies to the &lt;code&gt;get&lt;/code&gt; request in a test. With some help from my boss, we found out that &lt;code&gt;get&lt;/code&gt; takes a &lt;code&gt;headers&lt;/code&gt; param and you can pass a cookie if it looks like this: &lt;code&gt;headers = Map("Cookie" -&amp;gt; cookie_value)&lt;/code&gt;. To be honest, it required a bit of trial and error and I'm still trying to figure out exactly what values are being passed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fyolf3ryyl4o272qvnjfl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fyolf3ryyl4o272qvnjfl.png" alt="Whhhyyyy Scala!!!!"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;And finally... my servlet! Short and sweet.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


</description>
      <category>scala</category>
      <category>cookies</category>
      <category>jwt</category>
      <category>scalatra</category>
    </item>
    <item>
      <title>Introduction to Scala</title>
      <dc:creator>Jennifer Konikowski</dc:creator>
      <pubDate>Fri, 20 Apr 2018 13:57:04 +0000</pubDate>
      <link>https://forem.com/jennifer/introduction-to-scala-541d</link>
      <guid>https://forem.com/jennifer/introduction-to-scala-541d</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://www.jenniferkonikowski.com/blog/2018/4/13/introduction-to-scala"&gt;jmkoni.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I signed myself up to teach a Scala class through &lt;a href="https://www.girldevelopit.com/chapters/pittsburgh"&gt;Girl Develop It Pittsburgh&lt;/a&gt; a few months ago and the class was supposed to be tomorrow. I say "supposed to" because we only had two people sign up, so we ended up canceling. However, I still made a presentation! And since I spent all that time on a presentation, I decided to make a set of screencasts to accompany that presentation. If you've ever been interested in trying out Scala, I hope this helps. If you need any help or want me to go through some other aspect of Scala, feel free to &lt;a href="https://www.jenniferkonikowski.com/contact"&gt;contact me&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Find the screencast series &lt;a href="https://vimeo.com/album/5111827"&gt;here&lt;/a&gt; and the presentation &lt;a href="https://speakerdeck.com/jmkoni/scala-welcome-to-the-wonderful-world-of-functional-programming"&gt;here&lt;/a&gt;. And then bug Ben to allow for Vimeo and Speakerdeck embedding 😛.&lt;/p&gt;

</description>
      <category>scala</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>screencast</category>
    </item>
    <item>
      <title>On Being An Abrasive Woman (In Tech)</title>
      <dc:creator>Jennifer Konikowski</dc:creator>
      <pubDate>Tue, 03 Apr 2018 16:34:24 +0000</pubDate>
      <link>https://forem.com/jennifer/on-being-an-abrasive-woman-in-tech-44jk</link>
      <guid>https://forem.com/jennifer/on-being-an-abrasive-woman-in-tech-44jk</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally posted at &lt;a href="https://www.jenniferkonikowski.com/blog/2018/4/3/on-being-an-abrasive-woman-in-tech"&gt;jmkoni.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It's story time, y'all! All the names have been changed.&lt;/p&gt;

&lt;p&gt;One of my earlier jobs, I worked at a company that had the family vibe. Everyone hung out together, and we were all "friends." The company also really valued "niceness." I put that in quotes because the people who tended to get pinged for not being nice were women about 80-90% of the time. Heck, there was a guy who would regularly tell people they were "fucking stupid" and we'd laugh it off.   At this company, my team consisted of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;My manager (Peter)&lt;/li&gt;
&lt;li&gt;A guy who had been on the team for a year (Keenan)&lt;/li&gt;
&lt;li&gt;A guy who had been with the company for a long time but just joined the team (Erlich)&lt;/li&gt;
&lt;li&gt;And me&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a while, I really liked my manager and my team. The one caveat was Erlich who, like his namesake, was a total creep. He could be funny, but he was distracting and disruptive and just generally skeeved me out. For about six months, Keenan, Erlich, and I shared an office. Then a new developer joined the team (Richard) and I moved into an office with him. It was a lot quieter, and I got so much done. After another six months, Richard was let go. I went to Peter and requested that I stay in an office with this other guy on a related team, instead of moving back into the office with Erlich. I told Peter that Erlich was distracting and he creeped me out, and I would be more comfortable not sharing an office with him for 6-8 hours every day.&lt;/p&gt;

&lt;p&gt;I went on vacation a few days later, and while I was on vacation, Erlich was let go. I was a bit concerned about the timing, but he was also a shitty employee! So I didn't think it had anything to do with what I said. However, after I get back, Keenan starts treating me differently. I’m making a presentation to explain what we do to support, and I’m supposed to get feedback from him. I go back to Keenan at least five different times, and every time he tells me to make some other big change. Every time, I make the changes, but every time, it’s not enough.&lt;/p&gt;

&lt;p&gt;Then Keenan reports me to Peter for being abrasive. I can't remember the exact content of the email I got from Peter (which had HR copied), but it made it sound like I had cussed out this other guy on our team (Nelson) and I had to wrack my brain for what I said. I kept wondering if I had blacked out and forgotten saying something horrible. When I finally remember, I realized all I said was a rather direct “no, you’re wrong.” I got reported to HR for telling a coworker they were wrong. I talked to Peter about it, and he apologized to me and said he should have spoken to me first, but at that point, I realized I would probably just have to switch jobs.&lt;/p&gt;

&lt;p&gt;I've seen this double-standard exist in many places, but that was the most egregious. Maybe a month or so before this I had been eating lunch when Keenan decided to make the argument that "people with downs syndrome aren't people," and yet I was considered offensive for telling a man they were wrong.&lt;/p&gt;

&lt;p&gt;I don't have a summary for this story. It's just one I need to tell in hopes that it will make others consider more carefully how they are treating their female colleagues.&lt;/p&gt;

</description>
      <category>work</category>
      <category>communication</category>
      <category>womenintech</category>
    </item>
    <item>
      <title>Building A Community For Beginners</title>
      <dc:creator>Jennifer Konikowski</dc:creator>
      <pubDate>Tue, 21 Feb 2017 17:43:10 +0000</pubDate>
      <link>https://forem.com/jennifer/building-a-community-for-beginners</link>
      <guid>https://forem.com/jennifer/building-a-community-for-beginners</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally given as a talk at &lt;a href="http://www.pycaribbean.com"&gt;PyCaribbean&lt;/a&gt; on February 18, 2017. Modified slightly for the web. X-posted to &lt;a href="https://www.jenniferkonikowski.com/blog/2017/2/10/building-a-community-for-beginners"&gt;jmkoni.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I started programming in Python six years ago and have been doing Ruby development for the past five years. When I would go to user groups as a new developer, it was very intimidating. People seemed to know each other, and I wasn't sure who to ask for help. In the end, I stopped going and just created my own group. But many people get so discouraged that they decide programming isn't for them.&lt;/p&gt;

&lt;p&gt;That's the reason I believe that building a community for beginners is so important. Let me explain why. We want to ensure that our communities are open to beginners because we need to expand and diversify. The more diverse our community is, the more diverse our teams will be. According to the &lt;a href="https://hbr.org/2016/11/why-diverse-teams-are-smarter"&gt;Harvard Business Review&lt;/a&gt;, "working with people who are different from you may challenge your brain to overcome its stale ways of thinking and sharpen its performance."Â  I also think that everyone should be able to learn to program. Programming shouldn't be limited only to people who were privileged enough to learn to code in grade school. No matter their age, gender, or background, if someone wants to join our community, we should be open to helping them learn. Having community to help learn should not only be open to people willing to pay thousands of dollars for a code school. I started PyLadies Boston almost four years ago with the express intention of bringing more women into the Python community. I am also involved with Boston Ruby Women, leading weekly study sessions where I answer any questions that people bring me. More on these and a few others as we move on…&lt;/p&gt;

&lt;p&gt;How can you do your best to make sure your group is open to beginners? First, let's talk about new groups. As I mentioned, existing groups can still benefit from many of these ideas, so don't totally zone out if you already have a group that you run.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Make sure the way you describe your group and events is beginner inclusive&lt;/p&gt;

&lt;p&gt;Ex. “no problem too big or small “good for people of all levels”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Be clear about what knowledge and skills are required&lt;/p&gt;

&lt;p&gt;Be clear about what level of knowledge is required. People will often underestimate themselves, so keep this is mind when describing what is needed. Ex. “basic Python required, should have mostly completed a tutorial like Learn Python The Hard Way”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find out what your local community needs&lt;/p&gt;

&lt;p&gt;This is important. Every community needs different things. With PyLadies, we have a large community of academics and scientists, so there's a huge desire for tutorials and code reviews. With Boston Ruby Women, we have a lot of recent boot camp grads, so we spend a lot of time talking about interviews and finding jobs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ask for feedback all the time.&lt;/p&gt;

&lt;p&gt;Every year, I have an anniversary party and ask everyone who attends for feedback on the past year (what did you like, what did you not like) and for suggestions for the future. This regular evaluation of PyLadies has led us to have new types of events that I would never think of on my own and to get rid of ones that I thought would be successful that weren't.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Try out different types of events for the whole group. Depending on your local community, some may work better for you than others. Here are some event types that I've had success with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;Presentation Nights&lt;/em&gt; are the standard, but often there's an idea that you have to be an expert to give a presentation. Make it clear when asking for presentations that you are open to presentations about beginner projects.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Lightning Talks&lt;/em&gt; are a great way to get people to do their first public talk. One of the ways that I have encouraged people is to say that, while it should be related, if you have a hobby that you want to share with everyone, we'd love to hear a lightning talk on it. One of the members of PyLadies ended up doing her first presentation on bird-watching, and it was a huge hit!&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Tutorials&lt;/em&gt; are always successful. They give experienced people a chance to share their knowledge in a meaningful way and beginners a chance to learn a new skill or toolset. However, with tutorials it's key to allow for extra time in the beginning, or before the event, to get set up. Even if you give clear instructions and ask people to set up prior, believe me, you will still likely need extra time.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Mob Programming&lt;/em&gt; is where the whole group looks at the same problem and tries to solve it together. We started running events that were combination mob programming and code reviews, and they have been a blast. Everyone can participate: even with limited programming knowledge, you can get an idea of what kinds of problems other people are facing.&lt;/li&gt;
&lt;li&gt;Host separate beginner-focused events. These events will draw out people who are still too intimated to go to the main meetings. We regularly have women show up to our beginner events that almost never go to the main group because they don't feel they are ready, despite my encouragement.

&lt;ol&gt;
&lt;li&gt;Study groups can help people teach each other. At PyLadies, we try to have study groups every week and have a mentor each time. However, we've also encouraged our members to start study groups in their neighborhoods as well and have had a ton of success with that. I've used these to target people who are just starting to learn to code. If you are trying to provide mentors at study groups, it can be a challenge. One way to sell it to your more experienced members is that it's a way to both share their knowledge and improve their understanding of fundamentals. I have one woman who comes every week who always challenges me and makes me go deeper into the language than I had before.&lt;/li&gt;
&lt;li&gt;Mentor sessions are similar to study groups but more focused on career growth. These target people who know how to code and are looking to enter the industry. Job hunting as a junior is often very discouraging, and it helps to have regular meetings with someone who tells you that you can do it. Also, by getting to know a larger amount of junior developers, it makes it easier for you to find great developers who just haven't been given a chance yet. Through these groups, I've gotten two people hired at both Akamai and a previous company. Frequently, it is harder to get to know people in a larger group setting. Having a smaller subset like a mentor session can help your more experienced members get to know the individuals who are just getting started.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So that's some of the basics for starting a beginner-focused group, but what if you are currently running a group? Here are some suggestions that have been successful at bringing more beginners into both Boston Python and Boston RB. I'll start with the simplest:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Send an email to everyone who joins with a message that emphasizes that everyone is welcome, no matter their level of programming experience and let them know what they can expect to happen at your events. With Meetup, you can write a message once and automatically send it to every new member.&lt;/li&gt;
&lt;li&gt;If you can, have someone greet people as they walk in. Ideally, it will be one of the organizers, someone who is there regularly. This individual should do their best to get to know the people who have just joined. It will give all newcomers a friendly face each time they return and someone who is familiar with their level.&lt;/li&gt;
&lt;li&gt;For presentations nights, ensure that there are regular talks that are suitable for beginners. These talks do not have to be about â€˜how to write a for loop,' but more â€˜here's a problem, this is how I solved it,' with less emphasis on pure programming. Organizers I spoke to said they got large influxes of new sign-ups for nights when they had multiple speakers from a variety of fields.&lt;/li&gt;
&lt;li&gt;For project nights, a few suggestions:

&lt;ol&gt;
&lt;li&gt;Have a couple of beginner tables and, if you can, have a few experienced programmers to staff them and help new people work through issues.&lt;/li&gt;
&lt;li&gt;Do introductions at the beginning. Have everyone introduce themselves and mention what they are working on. You can ask experienced people to raise their hands if they are willing to be available for help throughout the night. It can be time-consuming, but it will help build community and create opportunities for people to collaborate.&lt;/li&gt;
&lt;li&gt;Reassure people that it's ok if they are not working on a project. You can have people raise their hands at the beginning if they are looking to collaborate on a project.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ok, last but not least: running workshops and finding the best way to teach people to code.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Running workshops is, personally, one of the biggest challenges as an organizer. Here's a rundown of some the problems and some suggestions on how to deal with them.

&lt;ol&gt;
&lt;li&gt;Space: given that a workshop is at least 6 hours long, you can't run one on weeknights. Therefore, most businesses won't want to host. However, you should try reaching out to local universities and community colleges - even better if you have someone in your group who works at one.&lt;/li&gt;
&lt;li&gt;Volunteers are a challenge at any time, but getting people to give away their Saturday (plus maybe their Friday night) is another problem entirely. Expect at least a couple of individuals to bail last minute, so have a backup plan. Make sure to have a few more volunteers than you think you need and be prepared to present if someone who is supposed to present doesn't show.&lt;/li&gt;
&lt;li&gt;Content is probably the easiest if you are doing a Django or Rails workshop since there are already full tutorials for both aimed at a weekend time frame. If you want to run a workshop for either of those, check out DjangoGirls, RailsGirls, and RailsBridge. If you want to do a workshop for a different language or framework, consider still looking at those for example of what you should include and adopt it for the framework that you want to cover. If considering a workshop on a language, review the material covered by the Boston Python Workshops. Though the materials are in Python, you could adapt them to fit other languages.&lt;/li&gt;
&lt;li&gt;Food - it's important to provide at least lunch when you have people stuck in a room for a full day. You can reach out to local companies who use the language or framework that you are teaching and get someone to provide food. Usually, they'll also want to send a volunteer for the workshop too so they can have someone to represent their company.Â &lt;/li&gt;
&lt;li&gt;Continued engagement is probably the biggest challenge. When people come to a workshop, make sure they know what the next steps are. When a RailsBridge Boston workshop occurs, they always make sure there is a Boston RB project night the week after so people can keep learning. You could also have lightning talks soon after and encourage people to talk about problems that they want to solve or applications they want to build.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;There is no "one best way" for teaching people how to code. However, I have had more success with some methods than with others.

&lt;ol&gt;
&lt;li&gt;Doesn't work:

&lt;ul&gt;
&lt;li&gt;Class style setting that builds on itself week after week potentially works if people are paying for it. However, if you are like me and just trying to provide a free service to your community, do not choose this option. I did this when I first started PyLadies because there was a demand for beginner classes. I held classes for just two hours every other weekend. I had a fantastic turnout the first week - 30 people showed up and were super engaged. The second week was still good - 20 people. Then it started dropping drastically. By the fifth week, it was just me and my co-organizer.&lt;/li&gt;
&lt;li&gt;Just giving a text tutorial (like Learn Code the Hard Way), with no support. With no support group or place to reach out for help, when people get to a tight spot, they can assume that they just aren't cut out for programming and quit. There's still a stigma that you have to be good at math to be a programmer, and some non-technical people think that only geniuses can program (have been told that I must be super smart because I'm a developer). Often it's just a matter of seeing the right example for a concept to make sense. Just because someone has trouble learning using one resource doesn't mean they couldn't learn using another.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Does work:

&lt;ul&gt;
&lt;li&gt;Short one-off tutorials on basic programming concepts that don't build on each other. You can't necessarily do a ton of these since most of programming does require knowing other concepts. But you can teach the idea of object-oriented programming without involving a significant amount of code. There are also other languages that you can learn the basics of in a two hour period - SQL being my favorite, but HTML also being a possibility. The goal is to share knowledge, so get creative!&lt;/li&gt;
&lt;li&gt;Having beginner focused events where people can bring questions from any tutorial they choose. As I mentioned above, this is an essential part of PyLadies Boston. I always suggest my two favorite tutorials, but if someone learns better another way (say a MOOC or videos), then they can use those and I will still be there to answer questions. I also try to make it clear in all communication that I am always available by email. Unless you have a group that is 5K plus people, this is not as big of a deal as you might think. I make myself available to about 1500 people through the groups I run and countless more through my website, yet I maybe get an email a week max. It will give people a lifeline if they need it, but it will not take up too much of your time.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are my recommendations on how to build a community for beginners. However you involve yourself, being part of a space where everyone is welcome to learn is a valuable and rewarding experience that can really make a difference to someone just starting out.&lt;/p&gt;

</description>
      <category>community</category>
      <category>learningtocode</category>
      <category>beginners</category>
    </item>
    <item>
      <title>A Quick Post About Resumes</title>
      <dc:creator>Jennifer Konikowski</dc:creator>
      <pubDate>Fri, 27 Jan 2017 20:50:41 +0000</pubDate>
      <link>https://forem.com/jennifer/a-quick-post-about-resumes</link>
      <guid>https://forem.com/jennifer/a-quick-post-about-resumes</guid>
      <description>

</description>
      <category>resumes</category>
      <category>jobsearching</category>
      <category>jobs</category>
      <category>jobadvice</category>
    </item>
    <item>
      <title>Getting Your First Job As A Software Developer</title>
      <dc:creator>Jennifer Konikowski</dc:creator>
      <pubDate>Fri, 30 Dec 2016 18:53:22 +0000</pubDate>
      <link>https://forem.com/jennifer/getting-your-first-job-as-a-software-developer</link>
      <guid>https://forem.com/jennifer/getting-your-first-job-as-a-software-developer</guid>
      <description>&lt;h1&gt;Preface&lt;/h1&gt;

&lt;p&gt;This post is aimed primarily at people who are transitioning to another industry, not new grads. New grads will probably get something from this post, but they are not the primary audience. With that said, this post will discuss primarily getting a job as a web developer since, not only is that what I have experience with, web dev jobs are usually the ones that junior developers can get.&lt;/p&gt;

&lt;h1&gt;Getting the Interview&lt;/h1&gt;

&lt;p&gt;In some ways, this can be the most daunting part. I'm going to break this up and hopefully help you to see that you (yes YOU!) have what it takes to apply.&lt;/p&gt;

&lt;h3&gt;Getting Your Resume Ready&lt;/h3&gt;

&lt;p&gt;One thing I always tell people is to make their existing jobs as technical as possible. For example, when I was applying to my first software developer job, I made my job at Home Depot (which was a PM job) sound like I did way more development. I did all the things that I put on my resume, but I emphasized the more relevant tasks and did not mention that my day to day was mostly working in Excel. Did you optimize a process at work? That shows how you can problem solve! Did you write a script to help you analyze data? Definitely add that. Also, writing actual code is not the only skill needed by developer. Chris Doyle, CTO of Pretty Quick, does a good job of summing this up (slightly paraphrasing from tweets):&lt;/p&gt;

&lt;p&gt;There are many valuable dev skills besides code, many of which you probably possess! Start there.&lt;a href="https://twitter.com/archslide/status/721412421152350209" rel="noopener noreferrer"&gt;[1]&lt;/a&gt;Also, your dev skills may be relatively small, but it doesn't mean they aren't already useful.&lt;a href="https://twitter.com/archslide/status/721412741634912256" rel="noopener noreferrer"&gt;[2]&lt;/a&gt; A junior developer sent me a cover letter identifying a potential UX improvement in my site, saying "This is something I could help you with."&lt;a href="https://twitter.com/archslide/status/721413114810511361" rel="noopener noreferrer"&gt;[3]&lt;/a&gt; That was such a concrete demonstration of initiative! They were an immediate favorite who was ultimately hired.&lt;a href="https://twitter.com/archslide/status/721414041554575360" rel="noopener noreferrer"&gt;[4]&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For new developers, I expect to invest in their training, so it's really about "are they going to multiply or waste effort".&lt;a href="https://twitter.com/archslide/status/721414744180199428" rel="noopener noreferrer"&gt;[5]&lt;/a&gt; I do consider their current ability and have a low minimum bar, but gaining confidence in trajectory is much more important.&lt;a href="https://twitter.com/archslide/status/721415368183562240" rel="noopener noreferrer"&gt;[6]&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What are these other valuable dev skills? Chris has created &lt;a href="http://arches.io/how-to-be-a-developer/" rel="noopener noreferrer"&gt;a whole list of developer competences&lt;/a&gt;. Don't worry if you look at that list and feel like you are missing a few. However, this list should help you decide what to include on your resume. For example, if you are currently in a customer support role, you are probably very good at suggesting possible causes for bugs! For more of my thoughts on resumes, see &lt;a href="http://www.jenniferkonikowski.com/blog/2016/2/24/a-quick-post-about-resumes" rel="noopener noreferrer"&gt;my post on the topic&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Creating Your Portfolio&lt;/h3&gt;

&lt;p&gt;This part of applying to jobs because less critical as you have more relevant experience. For example, a visit to my &lt;a href="https://github.com/jmkoni" rel="noopener noreferrer"&gt;github&lt;/a&gt; or &lt;a href="https://gitlab.com/u/jmkoni" rel="noopener noreferrer"&gt;gitlab&lt;/a&gt; pages would make one think that I never coded! False... all my code is just proprietary and I invest my time in PyLadies vs OSS. Works for me because I have former employers and coworkers who will back up the quality of my code. If you are starting out, you need to show it. As &lt;a href="https://twitter.com/calonso/status/721454863566159872" rel="noopener noreferrer"&gt;Carlos Alonso&lt;/a&gt; said, as a junior developer, "your public code is the most important part of your CV." &lt;a href="https://twitter.com/cathodion/status/723311606713716738" rel="noopener noreferrer"&gt;Dustin King&lt;/a&gt; recommends "writing a small game or other fun demo and putting it up online with code." Your project doesn't have to be huge, but you should have a friend QA it and make sure that there aren't glaring bugs. My project ended up being a choose your own adventure game that was part of going through Zed Shaw's &lt;a href="http://learnpythonthehardway.org/book/" rel="noopener noreferrer"&gt;Learn Python The Hard Way&lt;/a&gt;. However, I would recommend going a step further and building your own web app prior to applying. See the end of my &lt;a href="http://www.jenniferkonikowski.com/blog/2016/3/22/getting-started" rel="noopener noreferrer"&gt;"Getting Started As A Developer" post&lt;/a&gt; for more suggestions on how to get started with that.&lt;/p&gt;

&lt;h3&gt;Finding Jobs To Apply To&lt;/h3&gt;

&lt;p&gt;How do you even find jobs that are available? There are many great job boards out there, my favorite being &lt;a href="https://stackoverflow.com/jobs?t=c&amp;amp;r=home" rel="noopener noreferrer"&gt;Stack Overflow Jobs&lt;/a&gt;. But don't stick with just one. Search any job board that you can find and, as &lt;a href="https://twitter.com/chrsteinert/status/720881405337579520" rel="noopener noreferrer"&gt;Christian Steinert says&lt;/a&gt; "try not to only consider common tech companies. Others (like financial services) might offer interesting stuff." At this point, most companies have at least a few software developers on staff. If there's a company you love, look at their job board. If it looks like they have a few technical jobs, reach out! Being passionate about a company's mission/product can often get you pretty far. As an example, if I lived in San Francisco, I would be hounding &lt;a href="https://www.betabrand.com/referrals/landing/friend/?r=4L" rel="noopener noreferrer"&gt;Betabrand&lt;/a&gt; until they hired me. If you have extensive in a field, look at companies with that focus so that your past experience can be even more beneficial. For example, if you are a biologist by training and looking to switch to development, you might find a place like &lt;a href="https://www.addgene.org/careers/" rel="noopener noreferrer"&gt;AddGene&lt;/a&gt; to be a good fit. I, personally, have also enjoyed working with recruiters, like &lt;a href="http://www.talener.com/office/boston/" rel="noopener noreferrer"&gt;Talener in Boston&lt;/a&gt;. At bare minimum, they will get you in front of a ton of companies and get you in for interviews. Even if none of those pan out, it will be good practice and you will be better prepared when you find a job you are really excited about. Also, don't forget to milk your own personal connections! Do you know anyone who works at a company that's hiring devs? Contact them, see if they can meet you for coffee (buy them a coffee), and talk to them about what it's like to work at their company and their hiring process.&lt;/p&gt;

&lt;p&gt;Now that you have a long list of job postings, you maybe are starting to notice that they all seem to say that you need experience with all these different languages, maybe one of which you have used... how can you ever be ready? GOOD NEWS! Most job postings are wish lists. Yes, even the parts that say "Required" are often negotiable. If a job sounds interesting, you should apply. Let whoever is reviewing your resume determine whether you are qualified. The only phrase that should give you pause is "Senior". If a job posting is looking for a "Senior Application Developer" or something like that, the hiring manager is unlikely to hire a junior person instead. Even so, if it's a company that you are really passionate about, reaching out will not hurt.&lt;/p&gt;

&lt;h1&gt;Acing the Interview&lt;/h1&gt;

&lt;h3&gt;Before&lt;/h3&gt;

&lt;p&gt;One way to prepare is to work through a list of &lt;a href="https://ilovefoobar.wordpress.com/2012/12/15/interview-questions-for-graduatejunior-software-developers/" rel="noopener noreferrer"&gt;common interview questions&lt;/a&gt; and maybe a few &lt;a href="http://exercism.io/" rel="noopener noreferrer"&gt;exercism problems&lt;/a&gt;. Almost every interview I've had has also asked questions about SQL. Given that every job I have had has required me to use SQL in one form or another, I would recommend learning a bit before applying to any job. If you aren't up to speed yet, work through exercise 12 of &lt;a href="http://sql.learncodethehardway.org/book/" rel="noopener noreferrer"&gt;Learn SQL The Hard Way&lt;/a&gt;. It looks like most of the lessons probably aren't too time consuming and it will be well worth your time!&lt;/p&gt;

&lt;h3&gt;During&lt;/h3&gt;

&lt;p&gt;I wrote my own &lt;a href="http://www.jenniferkonikowski.com/blog/job-search-retrospective" rel="noopener noreferrer"&gt;"Job Search Retrospective"&lt;/a&gt; last September which talks about some of the things that I did in my most recent round of interviews that made me feel a lot more confident. As a junior, the most important thing to remember is that it's ok to say "I don't know" or "I don't know, but I was reading about this recently and I think it is [x]". An employer who you actually want will not be expecting you to be super knowledgable about development at this point. Stay calm on just make sure all your awesome qualities are on display. Most importantly, &lt;a href="http://jvns.ca/blog/2013/12/30/questions-im-asking-in-interviews/" rel="noopener noreferrer"&gt;don't forget to ask questions&lt;/a&gt;!&lt;/p&gt;

&lt;h3&gt;After&lt;/h3&gt;

&lt;p&gt;If you aren't sure that you did very well during the interview, don't despair! You still have time to make a good impression. Going back to &lt;a href="https://twitter.com/archslide/status/721414314633117696" rel="noopener noreferrer"&gt;Chris Doyle&lt;/a&gt;, he had a person who sent in a refactored version of a coding exercise they did during an interview. This is such a great demonstration of initiative and also that you continue to consider and think about your solution even after you have "solved" the problem. It is good to send an email to the interviewer and thank them. That's a perfect place to add in "and I've been thinking about that problem that we did and I think the solution could be improved by [x]".&lt;/p&gt;

&lt;h1&gt;Starting the Job&lt;/h1&gt;

&lt;h3&gt;Getting the Offer&lt;/h3&gt;

&lt;p&gt;The only advice that &lt;a href="https://twitter.com/samphippen/status/720743011433508867" rel="noopener noreferrer"&gt;Mr. Sam Phippen&lt;/a&gt; through out really struck a cord with me:&lt;/p&gt;

&lt;p&gt;Charge. More. People entering the industry consistently underestimate their reasonable salary band by about 20%.&lt;/p&gt;

&lt;p&gt;This hit me because, as of recently, I was underpaid by about 25%. To get an idea of what other places are paying, look at sites like &lt;a href="http://www.indeed.com/salary/q-Junior-Web-Developer-l-Boston,-MA.html" rel="noopener noreferrer"&gt;Indeed&lt;/a&gt; and the recent &lt;a href="http://stackoverflow.com/research/developer-survey-2016#work-salary" rel="noopener noreferrer"&gt;Stack Overflow Developer Survey&lt;/a&gt;. If you find out after the fact that you have undervalued yourself, you can fix it, but it takes a while. I speak from experience.&lt;/p&gt;

&lt;h3&gt;Doing the Work&lt;/h3&gt;

&lt;p&gt;Never feel bad about asking questions. Take advantage of the senior devs that you work with and learn as much as you can from them. If your company supports pairing, pair program as often as you can. You will learn so much more so much faster that way. Also, take charge of a project or a feature. That doesn't mean you have to do all the work, just that you are taking responsibility for making sure it gets past the finish line. Along those lines, &lt;a href="https://twitter.com/codepaintsleep/status/720755778144100353" rel="noopener noreferrer"&gt;@codepaintsleep says&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;Don't get stuck with grunt work just because you're junior. Push your knowledge when there's more experienced people to help! Also, don't write off grunt work as grunt work. Learn from everything!&lt;/p&gt;

&lt;p&gt;To give an example of how you can learn from everything, I am covering for a coworker and working support this week. I am not doing any actual coding. However, the amount that I have learned about how our system works and what our users want in just a week is incredible. Learn. From. EVERYTHING.&lt;/p&gt;

&lt;h1&gt;Postface&lt;/h1&gt;

&lt;p&gt;I hope you got something out of this. If you think I missed something, feel free to comment on the post or &lt;a href="http://www.jenniferkonikowski.com/contact" rel="noopener noreferrer"&gt;contact me&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
