<?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: Jon Skulski</title>
    <description>The latest articles on Forem by Jon Skulski (@jskulski).</description>
    <link>https://forem.com/jskulski</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%2F135256%2F7cdfea76-6e53-4aad-a67e-757ab39b239c.jpeg</url>
      <title>Forem: Jon Skulski</title>
      <link>https://forem.com/jskulski</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jskulski"/>
    <language>en</language>
    <item>
      <title>Field Report: Elm</title>
      <dc:creator>Jon Skulski</dc:creator>
      <pubDate>Mon, 17 Oct 2016 15:56:01 +0000</pubDate>
      <link>https://forem.com/jskulski/field-report-elm-1l26</link>
      <guid>https://forem.com/jskulski/field-report-elm-1l26</guid>
      <description>&lt;p&gt;&lt;em&gt;A few years ago I took Elm for a spin.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Elm?
&lt;/h3&gt;

&lt;p&gt;In brief, Elm is a functional language from the ML-family that compiles to javascript to run in the browser. It is at creating scalable web applications. Elm inspired parts of Redux. The mental models are similar.&lt;/p&gt;

&lt;p&gt;The community does a great job explaining itself at &lt;a href="http://elm-lang.org/"&gt;http://elm-lang.org/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  My experience is brief, but I liked what I saw.
&lt;/h3&gt;

&lt;p&gt;I spent a couple days with Elm building the game ‘snake’. I find the game to be a good exercise for learning user input and events in a new language or tool. So I gave it a shot:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cdn-images-1.medium.com/max/800/1*7MRS8w_fR3oTjFmiY4MYSw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://cdn-images-1.medium.com/max/800/1*7MRS8w_fR3oTjFmiY4MYSw.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Success, sort of! I’m still working on it, but &lt;a href="https://github.com/jskulski/snake-elm/blob/master/Main.elm"&gt;the code is available here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Elm is an exciting project. It has a lot of things going for it. Many of the technical aspects have been laid out by Mr. Rishi Goomar in his post “&lt;a href="https://medium.com/@rgoomar/why-i-think-elm-is-the-future-of-front-end-development-21e9b091fa05#.ns0pjprhf"&gt;Why I think Elm is the Future of Front End Development&lt;/a&gt;”.&lt;/p&gt;

&lt;p&gt;I also see a lot of promise with Elm.&lt;/p&gt;

&lt;h3&gt;
  
  
  Developer experience is a first class citizen
&lt;/h3&gt;

&lt;p&gt;My experience was that of fast feedback and minimal context switching. I was either looking at a compiler error or I was playing my game. &lt;em&gt;Even though, I just picked it up, I felt like I could make meaningful progress at each step.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I was shocked that the claim of “&lt;em&gt;no runtime exceptions&lt;/em&gt;” was actually true. When I introduced behaviors I wasn’t expecting, it was because my mental model was wrong (row, column vs column, row etc). There wasn’t side-effect-y bugs.&lt;/p&gt;

&lt;p&gt;Because of the bold claim, I skipped writing tests. I wanted to see how it held up. &lt;em&gt;No regressions.&lt;/em&gt; Each time I added a feature it stayed there.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Compiler messages are detailed and accurate.&lt;/em&gt; The only times I felt lost, I wasn’t reading the compiler message correctly. That’s the truth.&lt;/p&gt;

&lt;p&gt;Shoutout to vscode and its elm plugin. Without configuration, these compiler messages start showing up as you write code without having to run a command or context switch to another window.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=oYk8CKH7OhE"&gt;Elm has a stated goal to bring the benefits of functional programming to the masses&lt;/a&gt;. Which _requires d_eveloper user experience is a first class citizen. Elm delivers on that.&lt;/p&gt;

&lt;h3&gt;
  
  
  In the real world?
&lt;/h3&gt;

&lt;p&gt;Is Elm academic (yes) or can it be used in the real world? Great question! Here are some of my thoughts.&lt;/p&gt;

&lt;h4&gt;
  
  
  Some companies are reporting big wins
&lt;/h4&gt;

&lt;p&gt;&lt;a href="http://futurice.com/blog/elm-in-the-real-world"&gt;Futurice reports their switch here.&lt;/a&gt; No Red Ink has been loud about their use since adoption. The topic is discussed in the beginning of the following Q&amp;amp;A Panel:&lt;/p&gt;

&lt;h4&gt;
  
  
  Limits talent pool?
&lt;/h4&gt;

&lt;p&gt;A concern that I had was limiting the number of candidates to hire. Engineering teams need to grow, and if the pool of workers is small that can be a business problem. You have to either train or hire competitively. Interestingly enough, No Red Ink (in the video posted above) reports that after ‘being loud with their use of Elm’ &lt;em&gt;the quality of candidates skyrocketed.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Isn’t that incredible? Limiting your candidate pool and the number of people you want to hire increases?&lt;/p&gt;

&lt;p&gt;I find that fascinating. Paul Graham talked about this in his article, &lt;a href="http://paulgraham.com/pypar.html"&gt;The Python Paradox&lt;/a&gt;. To me, it makes some clown sense. Great engineers want to work with great tooling, so they go to places where they can.&lt;/p&gt;

&lt;p&gt;But /&lt;em&gt;this is only true for a limited window of time.&lt;/em&gt;/ In reference to the article, on a long enough timeline, python is the new java.&lt;/p&gt;

&lt;h4&gt;
  
  
  Similar to React/Redux
&lt;/h4&gt;

&lt;p&gt;Since Elm is essentially React/Redux enforced at the language level, I can see a team gaining a lot of productivity. It is the same tool with better and faster feedback that prevents anti-patterns, without limiting what you can build.&lt;/p&gt;

&lt;p&gt;The cost of switching could be pretty low. I have built a few apps in react and redux so I had a few hours of ‘oh this is that’ and then I was off to the races. I’d imagine that would be similar for a team used to react/redux.&lt;/p&gt;

&lt;p&gt;Of course, rewriting an app from react/redux to elm would make little business sense. There’s a number of tools to piece-meal change over a react app, including a React component that runs an Elm app. (Or vice versa) So you can work in chunks.&lt;/p&gt;

&lt;h4&gt;
  
  
  Young language and has limited tooling
&lt;/h4&gt;

&lt;p&gt;Elm is still figuring itself out. For example, in the v0.17 they changed the naming of a central concept from ‘Action’ to ‘Msg’ (Message). A small change, but a main part of the mental model (of the Html.App part of the language). It’s good to get that stuff right, of course, but reveals youth.&lt;/p&gt;

&lt;p&gt;The tooling is great but since the project is only 4 years old, tooling can be sparse. For example, I used VSCode which was a nice experience, but lacked proper syntax grammar files so I stared at lots of white text with blue variable names. That will get better with time.&lt;/p&gt;

&lt;h4&gt;
  
  
  Getting stuck with Elm
&lt;/h4&gt;

&lt;p&gt;My biggest concern would be adopting Elm and it being ‘over’. And now you have a codebase in a &lt;em&gt;language&lt;/em&gt; that nobody uses.&lt;/p&gt;

&lt;p&gt;Now it’s open source and the spec exists, so you can always write your own toolchain. But for very sound reasons, most web application shops don’t want to support a language. So, let’s say that adoption would depend on continued community or big-facebook-style-company support.&lt;/p&gt;

&lt;p&gt;So let’s just count this one as an all around risk. While the community is vibrant and active (5k chatting away in the slack, active meetups, a conference), it is young and small so there’s a chance this all goes away.&lt;/p&gt;

&lt;p&gt;That said, I think there’s /significant/ /competitive advantage/ to a business whose engineering team can reliably deploy web apps without errors or regressions. And Elm promises that.&lt;/p&gt;

&lt;h4&gt;
  
  
  Active friendly community
&lt;/h4&gt;

&lt;p&gt;I mentioned the community above, but I want to highlight how big of an asset this is. Communities are great indicators of adoption + success.&lt;/p&gt;

&lt;p&gt;I found the community to be warm, helpful and active. The documentation and tutorials are thorough, the modules to choose are (mostly) obvious. Help on the slack channel was fruitful and supportive. Answers to technical and design questions came quickly. Thanks, everyone!&lt;/p&gt;

&lt;p&gt;(PS If you’re in SF there is a &lt;a href="http://www.meetup.com/Elm-user-group-SF/events/234016091/"&gt;regular hack night&lt;/a&gt; this Wednesday. I’ll be there! Say hi!)&lt;/p&gt;

&lt;p&gt;(PPS There is also &lt;a href="https://docs.google.com/document/d/1qc3Rdbb3oAZnNd8gkgGgxnOSSu_aPV4fP5qojDCr8Tg/edit#"&gt;remote meet up&lt;/a&gt; happening on Oct, 24th.)&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusion
&lt;/h4&gt;

&lt;p&gt;I would like to try Elm out in a small app with a team to test these claims.&lt;/p&gt;

&lt;p&gt;Currently, there’s not much incentive to move away from React/Redux. It works pretty well and &lt;em&gt;we sorta, uh, just got here, man&lt;/em&gt;. There’s non-trivial risk in choosing Elm. So it doesn’t make sense to move to Elm wholesale. The push/pull thing doesn’t equal out. So that puts me in the camp of early adopter, and I’m okay with that. The benefits that are next-level.&lt;/p&gt;

&lt;p&gt;With most of my time with Elm, I felt directed toward solutions and never stuck on problems. Feedback was instant, I never felt stuck. When I wanted to change the structure to fit the new problem, I just did it and returned the program to a working state.&lt;/p&gt;

&lt;p&gt;Can you imagine the productivity of a whole team working with no runtime exceptions, minimal regressions and defect-free refactoring?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cdn-images-1.medium.com/max/800/1*pInKeEYPGpAzZdIJ8p9xdg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://cdn-images-1.medium.com/max/800/1*pInKeEYPGpAzZdIJ8p9xdg.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

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

</description>
      <category>javascript</category>
      <category>elm</category>
      <category>frontend</category>
      <category>fieldreport</category>
    </item>
    <item>
      <title>The Rush and Falsehood of Greenfield Projects</title>
      <dc:creator>Jon Skulski</dc:creator>
      <pubDate>Wed, 08 Oct 2014 20:59:57 +0000</pubDate>
      <link>https://forem.com/jskulski/the-rush-and-falsehood-of-greenfield-projects-2le4</link>
      <guid>https://forem.com/jskulski/the-rush-and-falsehood-of-greenfield-projects-2le4</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally written in 2014, republishing for the dev.to community&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;I used to love the idea of a green field project. I was envious at those who got to start from scratch. &lt;em&gt;This time, everything will be right.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J2HZp5v5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2A0BnzC8ndIKeXHaXbc1ypWw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J2HZp5v5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2A0BnzC8ndIKeXHaXbc1ypWw.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I was stuck on problems in university, when I couldn’t get the program to do what I needed, &lt;em&gt;I would routinely delete my entire project and start over&lt;/em&gt;. Sometimes it was effective, but most of the time I would just code myself right back to where I was.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q0gQaVYY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2At4YZAa0V01Mdnvv2RiS4SA.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q0gQaVYY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2At4YZAa0V01Mdnvv2RiS4SA.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The times it worked reinforced the belief that programs were &lt;em&gt;tight rope walks&lt;/em&gt;. That early missteps in thought, would cause the project to crumble. That to successfully complete a project, every decision needed to be &lt;em&gt;right and just and holy.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nkUC1bQf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2A992euKF2IXed0P1SvJOCSg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nkUC1bQf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2A992euKF2IXed0P1SvJOCSg.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ve changed my mind about all this now. I’m a bit older now (that’s how it usually goes). I’ve clocked a good number of hours in the cockpit, so to speak. Now, projects seem to me like big ships. They have a weighty inertia that you’ll have to control. Powering on in one direction might get you way of course, but you can &lt;em&gt;almost always&lt;/em&gt; slowly turn the ship back on course.&lt;/p&gt;

&lt;p&gt;Undeniably, &lt;em&gt;sometimes,&lt;/em&gt; the practice of restarting is very effective. Why? Well there’s the rush of getting to start over. But the more important factor was because I had re-&lt;em&gt;think about the problem.&lt;/em&gt; I stepped through the problem again, this time thinking &lt;em&gt;a little deeper.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I try to keep that part of it. Starting to think about the problem again, knowing nothing. But this time I keep my code around. &lt;em&gt;Beginner’s mind, not beginner’s project.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>career</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Refactoring, Rewriting and Lead Climbing</title>
      <dc:creator>Jon Skulski</dc:creator>
      <pubDate>Thu, 02 Oct 2014 17:58:59 +0000</pubDate>
      <link>https://forem.com/jskulski/refactoring-rewriting-and-lead-climbing-1689</link>
      <guid>https://forem.com/jskulski/refactoring-rewriting-and-lead-climbing-1689</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally written in 2014, republishing for dev.to&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’ve thrown the word &lt;em&gt;refactor&lt;/em&gt; around a lot. I’m like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What are you working on for the next three weeks?”&lt;br&gt;&lt;br&gt;
“I am going to refactor the login system”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;M. Fowler, in his wonderful book &lt;em&gt;Refactoring,&lt;/em&gt; gives the definition of &lt;em&gt;‘a change made to the internal structure of software…without changing its observable behavior’&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So technically, alright. Go ahead, me, &lt;em&gt;refactor&lt;/em&gt; the login system for three weeks. But words and accuracy are important. Perhaps I should just say I’m &lt;em&gt;rewriting&lt;/em&gt; the login system.&lt;/p&gt;

&lt;p&gt;Fowler also gives this definition:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;applying a series of refactorings without changing its observable structure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’m having more success with this definition. It’s safer and warmer and more comforting. If it’s a multiweek process without releasing to production, I’ll call that a &lt;em&gt;rewrite.&lt;/em&gt; And &lt;em&gt;rewrites&lt;/em&gt; are hard and scary and riskier. So I try to avoid ‘em.&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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2AmxRLCJM4fEFh0hTXn49f1w.gif" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2AmxRLCJM4fEFh0hTXn49f1w.gif" alt="Lead climbing. Many anchor points, several discrete releasable points."&gt;&lt;/a&gt;&lt;br&gt;
Lead climbing. Many anchor points, several discrete releasable points.&lt;/p&gt;

&lt;p&gt;When I conceive of a refactoring as a series of &lt;em&gt;discrete&lt;/em&gt; steps to improve the quality of the code, I take those small steps. By discrete, I mean releasable to production.&lt;/p&gt;

&lt;p&gt;Extract a method. Create a small class. Rename a variable. Add a type hint. Make a small, safe, confident commit in the right direction.&lt;/p&gt;

&lt;p&gt;Small steps carry us a long way.&lt;/p&gt;

</description>
      <category>refactoring</category>
      <category>code</category>
      <category>testing</category>
      <category>analogies</category>
    </item>
    <item>
      <title>Hello World</title>
      <dc:creator>Jon Skulski</dc:creator>
      <pubDate>Sat, 01 Jan 2000 01:01:01 +0000</pubDate>
      <link>https://forem.com/jskulski/hello-world-ikl</link>
      <guid>https://forem.com/jskulski/hello-world-ikl</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--j2zcAg-D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/23ph0nk8gqqvhaq7jeq7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--j2zcAg-D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/23ph0nk8gqqvhaq7jeq7.png" alt="Steve Martin"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If I had &lt;em&gt;one&lt;/em&gt; wish that I could wish this holiday season, it would be for all the children of the world to join hands and sing together in the spirit of harmony and peace. And to publish a blog with git.&lt;/p&gt;

&lt;p&gt;If I had &lt;em&gt;two&lt;/em&gt; wishes that I could wish for this holiday season, the first would be for all the children of the world to join hands and sing in the spirit of harmony and peace.. and the second would be for $30 million a month to be given to me, tax-free in a Swiss bank account."&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>hello</category>
      <category>world</category>
    </item>
  </channel>
</rss>
