<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Joseph Jung</title>
    <description>The latest articles on DEV Community by Joseph Jung (@ozymandias547).</description>
    <link>https://dev.to/ozymandias547</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%2F16472%2Ff7831a69-9677-481f-8ba1-b2c8ef8c0901.jpeg</url>
      <title>DEV Community: Joseph Jung</title>
      <link>https://dev.to/ozymandias547</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ozymandias547"/>
    <language>en</language>
    <item>
      <title>How my greenfield projects fall into muddy messes…</title>
      <dc:creator>Joseph Jung</dc:creator>
      <pubDate>Thu, 05 Apr 2018 05:16:41 +0000</pubDate>
      <link>https://dev.to/ozymandias547/how-my-greenfield-projects-fall-into-muddy-messes-18pn</link>
      <guid>https://dev.to/ozymandias547/how-my-greenfield-projects-fall-into-muddy-messes-18pn</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n4PGcwMG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s18.postimg.org/h4pzhvwxl/Screen_Shot_2018-04-04_at_11.44.15_PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n4PGcwMG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s18.postimg.org/h4pzhvwxl/Screen_Shot_2018-04-04_at_11.44.15_PM.png" alt="Lost it's head"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I started off as a developer, I remember the lead architect lamenting the fact that he hadn’t been on a“greenfield” project in a while - as he was scrolling through 30,000 lines of CSS code in one file…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;7 years later, I ask myself the question, “Have I learned how to keep a greenfield project ‘green’?”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the software world, the term “greenfield” refers to a brand new project, a lush undisturbed land, clean and un-trampled. In this place, a coder can lay down new laws, foundation, and ideals. He hopes people will come and view its beauty, maintainability, and scalability for years to come. Unfortunately, in one or two years time, reality comes crashing in with a vengeance. The project is no longer a “green field”, but rather a muddy mess.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;So what causes this? Here’s my opinion from my experience:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Narrow deadlines provide easy excuses to compromise on code quality.&lt;/li&gt;
&lt;li&gt;Tests fall behind because they’re hard to write and there’s not enough time.&lt;/li&gt;
&lt;li&gt;Team leads are too embarrassed or not skilled enough for code reviews.&lt;/li&gt;
&lt;li&gt;Scope creep messes up the most well-laid abstractions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So how do you combat “muddy mess” syndrome? Ideally, you handle it BEFORE the technical debt accrues, but that hardly ever realistically happens. First of all, accept the fact that you WILL have to let go of some of your rules. Regardless, enumerate the most important ones (like testing) and hold fast to them. Communicate those principles. Don’t be afraid to say “that code is not very good”. Do these things, and next thing you know, you’ll be promoted to engineering lead, and you can slowly melt into middle management.&lt;/p&gt;




&lt;p&gt;This is original content from &lt;a href="https://www.snaptest.io"&gt;snaptest.io&lt;/a&gt;, made because I needed to get tests made quickly and easily for many “muddy mess” projects.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Getting your head around Chrome headless</title>
      <dc:creator>Joseph Jung</dc:creator>
      <pubDate>Thu, 17 Aug 2017 19:09:42 +0000</pubDate>
      <link>https://dev.to/ozymandias547/so-many-testing-frameworks-so-littletime</link>
      <guid>https://dev.to/ozymandias547/so-many-testing-frameworks-so-littletime</guid>
      <description>&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%2F5x4e1iqbn4rrpn65uw9z.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%2F5x4e1iqbn4rrpn65uw9z.png" alt="Lost it's head"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A slew of new automation “stuff has just arrived due to &lt;a href="https://developers.google.com/web/updates/2017/04/headless-chrome" rel="noopener noreferrer"&gt;Chrome’s new headless feature in v59&lt;/a&gt;. As creator of &lt;a href="https://www.snaptest.io" rel="noopener noreferrer"&gt;snaptest.io&lt;/a&gt;, it’s my job to stay up-to-date with them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;So here’s what you need toÂ know:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A headless browser means you don’t see it open when you start it, it’s all in memoryâ€Š–â€Šand it also implies user actions are automated.&lt;br&gt;
Uses of &lt;strong&gt;&lt;em&gt;automation&lt;/em&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;QA tests&lt;/li&gt;
&lt;li&gt;Scraping&lt;/li&gt;
&lt;li&gt;Pre-rendering single-page apps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uses of &lt;strong&gt;&lt;em&gt;headless&lt;/em&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Less resource intensive.&lt;/li&gt;
&lt;li&gt;Great for build-systems running tests before a deploy.&lt;/li&gt;
&lt;li&gt;Can run in many more server environments, like Lambda.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Is this the first headless automated browser?&lt;/em&gt;&lt;/strong&gt; No, phantomJS has been the goto browser like this, but the main contributor almost immediately &lt;a href="https://groups.google.com/forum/#!topic/phantomjs/9aI5d-LDuNE" rel="noopener noreferrer"&gt;stepped down when he heard about Chrome’s new headless feature&lt;/a&gt;Â . Turns out its hard to maintain an ENTIRE browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  So what’s actually new in ChromeÂ v59?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;running the executable like this: &lt;code&gt;chromeâ€Š–â€Šheadlessâ€Š–â€Šdisable-gpuâ€Š–â€Šremote-debugging-port=9222&lt;/code&gt; which opens it without a visible window.&lt;/li&gt;
&lt;li&gt;then sending commands to the above port… closest to the metal node library is &lt;a href="https://www.npmjs.com/package/chrome-remote-interface" rel="noopener noreferrer"&gt;this one&lt;/a&gt;Â .&lt;/li&gt;
&lt;li&gt;the above commands give you ability to do almost anything a user would do… so you can scrape data or make tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The community is responding
&lt;/h3&gt;

&lt;p&gt;The community has decided that we need a pretty wrapper around this “low level stuff, and have started making these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/graphcool/chromeless" rel="noopener noreferrer"&gt;Chromeless&lt;/a&gt; (a combination of the words “Chrome and “Headless and maybe even “Serverless”).&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/GoogleChrome/puppeteer" rel="noopener noreferrer"&gt;Puppeteer&lt;/a&gt; (Googles very own “lightweight wrapper”)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/LucianoGanga/simple-headless-chrome" rel="noopener noreferrer"&gt;Simple-headless-chrome&lt;/a&gt; (another wrapper)
Probably many more to come!&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;What’s the state of each of these frameworks? Let’s find out in a couple months once they’ve grown up a bit. Comparing and contrasting right now would be a practice in futility.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Be thankful for your github repo graveyard</title>
      <dc:creator>Joseph Jung</dc:creator>
      <pubDate>Fri, 21 Apr 2017 22:27:28 +0000</pubDate>
      <link>https://dev.to/ozymandias547/be-thankful-for-your-github-repo-graveyard</link>
      <guid>https://dev.to/ozymandias547/be-thankful-for-your-github-repo-graveyard</guid>
      <description>&lt;p&gt;I have a good feeling that I’m not alone when I see a desolate graveyard of repositories when signing in to Github. Here’s a list of some casualties in my account with post-mortems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;jDrawer&lt;/strong&gt;â€Š–â€Ša jQuery drawer plugin. Died quickly after getting hit by a “no one cared” bus…&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KodeKarate&lt;/strong&gt;â€Š–â€Šcollaborative code/test writing… though having a hip name, it suffered from a “too over-complicated” attack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hail-the-king&lt;/strong&gt;â€Š–â€ŠA javascript clone of Travian… Had a bad case of “too ambitious” and died young.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A web pack starter kit&lt;/strong&gt;â€Š–â€ŠHad a good run with … 5 users? Still limping along but about to croak.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;lwrnc(stands for Lawrence)&lt;/strong&gt; rendererâ€Š–â€ŠA node template renderer– suffocated after finding out renderers were much more complicated originally thought.
This list goes on and on…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It may be tempting to look back on these projects and regret the “lack of motivation”, but is that really what happened?&lt;br&gt;
I think project graveyards are actually good things, and should be viewed so. Why’s that? It shows that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You are ambitious.&lt;/li&gt;
&lt;li&gt;You at least know when to quit.&lt;/li&gt;
&lt;li&gt;You’ve probably learned that you should think things through BEFORE you start.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It’s inevitable that &lt;strong&gt;&lt;em&gt;you will fall out of love with your project&lt;/em&gt;&lt;/strong&gt;, after which the value it provides to others will be what keeps you motivated.&lt;br&gt;
Think about itâ€Š–â€Šmost of these dead projects probably would’ve taken way too much timeâ€Š–â€Šit’s not easy to bring a project to the public… bug fixes, complaints, feature requests, potential hosting costs… a whole host of headaches.&lt;/p&gt;

&lt;p&gt;I think I’ve made a tool that provides value for peopleâ€Š–â€Š&lt;a href="https://www.snaptest.io"&gt;A chrome extension called snaptest&lt;/a&gt; that emulates Selenium in the browser so you can actually easily debug your QA tests. I find value with it at work, and other people email me saying that it helps them a lot. Even though it may not be the most interesting subject matter in the world, it provides value to others, which gives me the “good feels”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;So keep looking for ways to add value, and be thankful for your github graveyard.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The guilt of not testing everything</title>
      <dc:creator>Joseph Jung</dc:creator>
      <pubDate>Thu, 13 Apr 2017 15:46:06 +0000</pubDate>
      <link>https://dev.to/ozymandias547/the-guilt-of-not-testing-everything</link>
      <guid>https://dev.to/ozymandias547/the-guilt-of-not-testing-everything</guid>
      <description>

&lt;p&gt;My CTO: “We’re really impressed with your testing solution, you’ve gone above and beyond!”&lt;/p&gt;

&lt;p&gt;(Immediate feeling of guilt washes over me)&lt;/p&gt;

&lt;p&gt;This happened a couple months ago after my CTO heard about a testing solution I put together for our web applications. My solution was to auto-generate the QA Selenium code instead of manually coding it by recording/configuring the tests. (Shameless plug: it’s available for free over at &lt;a href="https://www.snaptest.io"&gt;snaptest.io&lt;/a&gt; . This tool has dramatically increased coverage - but why did I still feel guilty about accepting this compliment?&lt;/p&gt;

&lt;p&gt;It’s because I unreasonably assume testing should be &lt;strong&gt;&lt;em&gt;exhaustive.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Exhaustive testing: refers to running a test on every possible combination of actions/data.
&lt;/h4&gt;

&lt;p&gt;The guilt comes when I say things like: “I’ve tested the new feature”, or “the tests are passing”. In the back of my mind, I know there are hundreds of thousands of combinations I didn’t test for.&lt;/p&gt;

&lt;p&gt;We must give ourselves a break and remember that exhaustive testing is usually not possible. One must reconcile the cost/reward balance sheet of testing… Especially when you start thinking about negative tests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Negative tests/Destructive tests/error path testing&lt;/strong&gt;â€Š–â€Šrefers to checking how gracefully a system handles errors or unexpected situations. This is when exhaustive testing gets exhausting… Don’t expect to get them all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here are my recommendations for handling negative test cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pick off the easy negative tests like form validation.&lt;/li&gt;
&lt;li&gt;Defer negative tests that will take a lot of work to create and maintain. Such as 1 slow network connections on mobile applications. It may be more economical just to manually test those occasionally.&lt;/li&gt;
&lt;li&gt;Spend time making negative tests on the most commonly experienced errors. Ask yourselves, which errors are users most likely to see? Cover those ones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Don’t worry if you don’t cover every state of the app. Just remember, any test is helpful!&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;


</description>
      <category>testing</category>
      <category>softwaretesting</category>
      <category>software</category>
      <category>development</category>
    </item>
  </channel>
</rss>
