<?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: William Narmontas</title>
    <description>The latest articles on DEV Community by William Narmontas (@scalawilliam).</description>
    <link>https://dev.to/scalawilliam</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%2F458%2F8d405505-6717-4c21-b27a-d9c4b307f787.jpg</url>
      <title>DEV Community: William Narmontas</title>
      <link>https://dev.to/scalawilliam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/scalawilliam"/>
    <language>en</language>
    <item>
      <title>Web standards for content syndication</title>
      <dc:creator>William Narmontas</dc:creator>
      <pubDate>Sun, 21 May 2017 00:43:46 +0000</pubDate>
      <link>https://dev.to/scalawilliam/web-standards-for-content-syndication</link>
      <guid>https://dev.to/scalawilliam/web-standards-for-content-syndication</guid>
      <description>&lt;p&gt;&lt;a href="https://www.scalawilliam.com/web-standards-for-content-syndication/"&gt;https://www.scalawilliam.com/web-standards-for-content-syndication/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've been making websites since 2004 and the one thing that struck me is how brittle it is to synchronise content over HTTP and also how to do it instantaneously. For example, when I write a blog post I'd like it to be synchronised to my own website, perhaps posted to Twitter or get a trackback/pingback - many different targets with many different intentions.&lt;/p&gt;

&lt;p&gt;Perhaps it's not a blog post but an automatically generated item. It may be urgent or non-urgent, it may be frequent or infrequent.&lt;/p&gt;

&lt;p&gt;In this article, I'm only interested in one-way data sharing, so WebSockets is out of the picture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pull
&lt;/h2&gt;

&lt;p&gt;Pulling by polling means initiating a request to a server every X minutes and then checking if the content has changed.&lt;/p&gt;

&lt;p&gt;This introduces a maximum delay and requires setting up scheduled tasks. Also you want to make sure not to exceed usage limits of the target server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://validator.w3.org/feed/docs/atom.html"&gt;Atom&lt;/a&gt; and &lt;a href="https://cyber.harvard.edu/rss/rss.html"&gt;RSS&lt;/a&gt; are good for providing a structured pull approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Push
&lt;/h2&gt;

&lt;p&gt;Pushing means that as soon as your content is published, YOU call into different targets to notify them of what has happened. It's reactive.&lt;/p&gt;

&lt;p&gt;There are three flavours of push. If you want to be receiving the pushes, you need to host a dynamic server which is a disadvantage especially if you use static hosting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Predefined set of targets
&lt;/h3&gt;

&lt;p&gt;If you wanted to tweet automatically, at the point of publishing, you'd call into the Twitter &lt;a href="https://indieweb.org/silos"&gt;silo API&lt;/a&gt;, but now you have to customise it for every single target. This typically happens with an HTTP POST.&lt;/p&gt;

&lt;h3&gt;
  
  
  Self-managing subscribers
&lt;/h3&gt;

&lt;p&gt;One interesting use case I have is in &lt;a href="https://actionfps.com/"&gt;ActionFPS&lt;/a&gt; where I wish to automatically enter tournament data into Challonge when a "clan war" is played. One way for me to do it is by calling into Challonge directly (current, but brittle), and the other way is to create a separate service (akin to microservices) to react to these events.&lt;/p&gt;

&lt;p&gt;But I wish other people to be able to react as well. So I'm going to try out &lt;a href="https://www.w3.org/TR/websub/"&gt;WebSub&lt;/a&gt; which is a W3 Candidate Recommendation from 11 April 2017, previously known as &lt;a href="https://en.wikipedia.org/wiki/PubSubHubbub"&gt;PubSubHubbub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is what we should be doing in microservices; not tightly coupled approaches.&lt;/p&gt;

&lt;h3&gt;
  
  
  Content-based targets
&lt;/h3&gt;

&lt;p&gt;... such as mentions. There's a new standard out there called Webmention, which is similar to the good old xml-rpc, pingback and trackback.&lt;/p&gt;

&lt;p&gt;Webmention enables conversations. Here's the specification: &lt;a href="https://www.w3.org/TR/webmention/"&gt;https://www.w3.org/TR/webmention/&lt;/a&gt; - which is a W3C Recommendation as of 12 January 2017.&lt;/p&gt;

&lt;p&gt;Effectively, if you want to receive webmentions, you place a &lt;code&gt;&amp;lt;link rel="webmention"/&amp;gt;&lt;/code&gt; in your HTML and when someone mentions your page, they will call that endpoint.&lt;/p&gt;

&lt;p&gt;Because of this approach, you can &lt;a href="https://webmention.net/implementations/"&gt;use free services&lt;/a&gt; like &lt;a href="https://brid.gy/"&gt;Bridgy&lt;/a&gt; (&lt;a href="https://github.com/snarfed/bridgy"&gt;open source&lt;/a&gt;) to automatically post your content to Twitter and other places, and also syndicate responses &lt;strong&gt;back&lt;/strong&gt;! You don't need centralisation or the "let's write our own Twitter adapter" approach above. Nice!&lt;/p&gt;

&lt;h2&gt;
  
  
  Pull-push
&lt;/h2&gt;

&lt;p&gt;This is my favourite approach: EventSource (aka Server-Sent-Events). The W3 Draft is here: &lt;a href="https://www.w3.org/TR/2011/WD-eventsource-20111020/"&gt;https://www.w3.org/TR/2011/WD-eventsource-20111020/&lt;/a&gt; - it's also reactive.&lt;/p&gt;

&lt;p&gt;EventSource is &lt;a href="http://caniuse.com/#feat=eventsource"&gt;available in most browsers except IE&lt;/a&gt; - but you can use a &lt;a href="https://github.com/Yaffle/EventSource"&gt;polyfill for IE&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;EventSource has a good &lt;a href="https://github.com/EventSource/eventsource"&gt;Node.js library&lt;/a&gt; and also comes with reliability included - if you missed out an event then you can recover from the last event you saw. I made a &lt;a href="https://github.com/EventSource/eventsource/pull/74"&gt;small contribution&lt;/a&gt; to that library several weeks ago so that I could &lt;a href="https://github.com/actionfps/actionfps-clone-logs"&gt;synchronise logs from ActionFPS&lt;/a&gt; to my local machine in real time. There's also a &lt;a href="http://developer.lightbend.com/docs/alpakka/current/sse.html"&gt;Scala client for SSE&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Advantage is that your receiver is a client and not a server, but a disadvantage is that it's a continuous connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Push API
&lt;/h2&gt;

&lt;p&gt;Made for web browsers. &lt;a href="https://www.w3.org/TR/push-api/"&gt;Push API: W3C Working Draft 08 May 2017&lt;/a&gt;. Uses &lt;a href="https://developers.google.com/web/fundamentals/getting-started/codelabs/push-notifications/#register_a_service_worker"&gt;service workers&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Further reading
&lt;/h1&gt;

&lt;p&gt;Of interest might also be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://indieweb.org/micropub"&gt;https://indieweb.org/micropub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://switchboard.p3k.io/"&gt;https://switchboard.p3k.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://indieweb.org/"&gt;https://indieweb.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://indieweb.org/own-your-data"&gt;https://indieweb.org/own-your-data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://microformats.org/wiki/microformats-2"&gt;http://microformats.org/wiki/microformats-2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;Basically, decide to use the approach purely based on the frequency and urgency of delivery of your content:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Infrequent &amp;amp; not urgent, no server to receive - pull&lt;/li&gt;
&lt;li&gt;Infrequent &amp;amp; urgent, with server to receive - push&lt;/li&gt;
&lt;li&gt;Urgent, browser-only - Push API&lt;/li&gt;
&lt;li&gt;Frequent, no server to receive - pull-push&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>syndication</category>
    </item>
    <item>
      <title>Unit testing is simple</title>
      <dc:creator>William Narmontas</dc:creator>
      <pubDate>Thu, 04 May 2017 06:56:56 +0000</pubDate>
      <link>https://dev.to/scalawilliam/unit-testing-is-simple</link>
      <guid>https://dev.to/scalawilliam/unit-testing-is-simple</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;a href="https://www.scalawilliam.com/unit-testing-is-simple/" rel="noopener noreferrer"&gt;https://www.scalawilliam.com/unit-testing-is-simple/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Is unit testing difficult?&lt;/p&gt;

&lt;p&gt;No, it is not. You don't even need a testing framework for it.&lt;br&gt;
You don't even need to write the test in a separate file or class.&lt;/p&gt;

&lt;p&gt;You just need to &lt;a href="http://tldp.org/LDP/abs/html/exitcodes.html" rel="noopener noreferrer"&gt;exit with code 1&lt;/a&gt;. This is enough to fail a Jenkins build and a Makefile!&lt;/p&gt;

&lt;p&gt;Why is a unit test useful?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevent regressions when you change the code.&lt;/li&gt;
&lt;li&gt;Document expected input and output as code.&lt;/li&gt;
&lt;li&gt;Replace error-prone &lt;a href="http://codebetter.com/jeremymiller/2006/06/01/tdd-and-debugging/" rel="noopener noreferrer"&gt;println-driven development with test-driven development&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What do you test?&lt;/strong&gt; when the logic is "complex enough" I know it could be broken 6 months down the line, due to "that one small change" - or that I'd spend time building it with print statements. &lt;a href="https://github.com/ActionFPS/dashboard/blob/e757931de22d82edd20e4ef5ad3b2df56d433a16/test_build.py#L82" rel="noopener noreferrer"&gt;Example from my own code&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here, I'll show you the most basic way to unit testing with four languages: Bash, Python, Node.js, Scala, just to prove the point. &lt;/p&gt;

&lt;p&gt;These examples are for a very basic piece of code and are intentionally minimalistic, to demonstrate that you needn't use a test framework to get started with - though one will be very necessary when you scale your application.&lt;/p&gt;
&lt;h2&gt;
  
  
  Bash
&lt;/h2&gt;

&lt;p&gt;Here's a bash script &lt;code&gt;inc.sh&lt;/code&gt; with a basic assertion and some main code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

increment&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# If this assertion fails, the whole thing quits &lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; 3 &lt;span class="nt"&gt;-eq&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;increment 2&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1

&lt;span class="c"&gt;# Increment a stream of numbers&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read &lt;/span&gt;n&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;increment &lt;span class="nv"&gt;$n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ seq 1 5 | bash inc.sh
2
3
4
5
6
$ echo $?
0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exit code is 0. But if we broke the function, and put 2 instead of 1, we get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ seq 1 5 | bash inc.sh
$ echo $?
1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Python
&lt;/h2&gt;

&lt;p&gt;This is easy to achieve in any language really. &lt;a href="https://docs.python.org/2/reference/simple_stmts.html#the-assert-statement" rel="noopener noreferrer"&gt;Python assertions&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;Broken test in file &lt;code&gt;inc.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ python inc.py
Traceback (most recent call last):
  File "inc.py", line 4, in &amp;lt;module&amp;gt;
    assert increment(2) == 3
AssertionError
$ echo $?
1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Node.js
&lt;/h2&gt;

&lt;p&gt;Comes with &lt;a href="https://nodejs.org/api/assert.html#assert_assert_equal_actual_expected_message" rel="noopener noreferrer"&gt;assertions built in&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Broken test in file &lt;code&gt;inc.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;assert&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ node inc.js

assert.js:81
  throw new assert.AssertionError({
  ^
AssertionError: 2 == 3

...
$ echo $?
1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;a href="http://scala-lang.org/" rel="noopener noreferrer"&gt;Scala&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Comes with assert.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight scala"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;inc&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="k"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="nf"&gt;assert&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;inc&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ scala inc.scala
java.lang.AssertionError: assertion failed
$ echo $?
1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Why is this important?
&lt;/h1&gt;

&lt;p&gt;You can get started light with several assertions and work your way up to proper test suites.&lt;/p&gt;

&lt;h1&gt;
  
  
  So what are test frameworks for?
&lt;/h1&gt;

&lt;p&gt;To make testing more organised. You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organisation&lt;/li&gt;
&lt;li&gt;Detailed error messages&lt;/li&gt;
&lt;li&gt;Detailed test reports&lt;/li&gt;
&lt;li&gt;Neat assertions and human readable language (see &lt;a href="http://www.scalatest.org/" rel="noopener noreferrer"&gt;ScalaTest&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Incremental/TDD type of development&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Now you have no excuse for not writing at least a few tests in your code.&lt;/p&gt;

</description>
      <category>testing</category>
    </item>
    <item>
      <title>Certifications I'm considering, as an experienced software engineer</title>
      <dc:creator>William Narmontas</dc:creator>
      <pubDate>Sat, 29 Apr 2017 02:10:29 +0000</pubDate>
      <link>https://dev.to/scalawilliam/certifications-im-considering-as-an-experienced-software-engineer</link>
      <guid>https://dev.to/scalawilliam/certifications-im-considering-as-an-experienced-software-engineer</guid>
      <description>&lt;p&gt;In building more and more open source projects spanning the full project lifecycle, I am appreciating the importance of structured business requirement analysis, architecture, software testing and project management.&lt;/p&gt;

&lt;p&gt;I am already more than an engineer, with experience in all of these things but as a secondary concern without any formal knowledge. But it's precisely the secondary skill-sets that need some formal backing, and not the primary ones - because there's already a mountain of evidence of my skill in the primary ones.&lt;/p&gt;

&lt;p&gt;I want my secondary skills to enhance my primary skills, with formal and certified method. In some environments, such formal badges are a big plus. Why?&lt;/p&gt;

&lt;p&gt;For example, the team that I work with in Singapore (a country where authority really matters) is made up of PhDs who appreciate both formal knowledge and experience. In Scala engineering I have a lot of experience so I've no problem arguing my case, whereas in my secondary skills I have less focused experience and no formal backing. In discussions, I myself am not sure whether I'm putting the right arguments. Authority is important, and when backed by &lt;em&gt;both&lt;/em&gt; by formal method and experience, is very impactful.&lt;/p&gt;

&lt;p&gt;Thanks to my coworkers I've learned to prepare for arguments and became better at answering the "Why?". This prepares me well for the future of developing excellent products for myself and others.&lt;/p&gt;

&lt;h1&gt;
  
  
  Requirements
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;No training courses required, can self-study, whenever I want and for how long I want.&lt;/li&gt;
&lt;li&gt;No work experience of that specific field required, with minimal bureaucracy.&lt;/li&gt;
&lt;li&gt;Can be taken at test centres at around the world, like Pearson VUE.&lt;/li&gt;
&lt;li&gt;Membership not required and renewals have a reasonable cost.&lt;/li&gt;
&lt;li&gt;Recognised enough but does not have to be popular.&lt;/li&gt;
&lt;li&gt;Entry level is enough, since they are only secondary skills.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But why not take it all the way? Well, law of diminishing returns. From experience, when people get things wrong, most of the time it is at the basic level. Like instead of acceptance criteria or tests first, they start with writing the code. Basic level is more than enough in probably a good 90% of the cases.&lt;/p&gt;

&lt;h1&gt;
  
  
  Certifications I found
&lt;/h1&gt;

&lt;p&gt;Here are some certifications I found that match the criteria.&lt;/p&gt;

&lt;h2&gt;
  
  
  Business Analysis
&lt;/h2&gt;

&lt;p&gt;I found the following sites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.batimes.com/elizabeth-larson/which-business-analysis-certification-is-right-for-me-five-crucial-questions-to-ask-yourself.html"&gt;BAtimes - Which Business Analysis Certification Is Right For Me? Five Crucial Questions To Ask Yourself&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.quora.com/What-is-the-best-business-analyst-certification"&gt;Quora - What is the best business analyst certification?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From this,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ireb.org/en/cpre/foundation/"&gt;IREB - CPRE - Foundation Level - CPRE FL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.iiba.org/Certification-Recognition/certificationlevels/level1-ecba.aspx"&gt;IIBA - Level 1 - Entry Certificate in Business Analysis (ECBA)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.softwarecertifications.org/caba/"&gt;QAI's Certified Associate Business Analyst: (CABA)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Software testing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.softwaretestinghelp.com/best-software-testing-certifications/"&gt;8 Best Software Testing Certifications Based on Your Experience Level&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From this, &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.softwarecertifications.org/cast/"&gt;QAI - Certified Associate in Software Testing (CAST)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.istqb.org/certification-path-root/foundation-level/foundation-level-in-a-nutshell.html"&gt;ISTQB - Foundation Level&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.tomsitpro.com/articles/enterprise-architect-certifications,2-640.html"&gt;Tom's IT Pro - Best Enterprise Architect Certifications For 2017&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mikethearchitect.com/2011/12/enterprise-architecture-certifications-distilled.html"&gt;Mike The Architect - Enterprise Architecture Certifications Distilled&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From this,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://soaschool.com/certifications"&gt;SOA School&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Other
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.pmi.org/certifications/types/agile-acp"&gt;PMI Agile Certified Practitioner (PMI-ACP)Â®&lt;/a&gt; - but has some practice requirement&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/certification/certified-developer-associate/"&gt;AWS Certified Developer - Associate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=5001&amp;amp;get_params=p_exam_id:1Z0-808"&gt;Oracle - Java SE 8 Programmer I&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.apmg-international.com/en/qualifications/CPTC/CPTC.aspx"&gt;Certified Professional Technical Communicator&lt;/a&gt; from &lt;a href="https://www.stc.org/certification/"&gt;Society for Technical Communication&lt;/a&gt; - interesting because it covers planning, analysis and the like.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  What I'll choose
&lt;/h1&gt;

&lt;p&gt;Still thinking about this. I notice they're still quite niche, and are more like components of the bigger picture, which is delivering products to users. Perhaps I need to look at something closer to the user, to product ownership and product development. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>2017 freelance development platforms</title>
      <dc:creator>William Narmontas</dc:creator>
      <pubDate>Thu, 20 Apr 2017 02:25:46 +0000</pubDate>
      <link>https://dev.to/scalawilliam/2017-freelance-development-platforms</link>
      <guid>https://dev.to/scalawilliam/2017-freelance-development-platforms</guid>
      <description>&lt;p&gt;In designing &lt;a href="https://github.com/ScalaWilliam/git-work"&gt;Git Work&lt;/a&gt;, I must analyse other relevant services.&lt;/p&gt;

&lt;p&gt;I'm publishing this article as a draft so it's out there and I can get feedback from you guys, perhaps I missed something?&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="http://codemill.io"&gt;Codemill&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;"Marketplace for pull requests", so focused on pull requests&lt;/li&gt;
&lt;li&gt;Integrated with GitHub&lt;/li&gt;
&lt;li&gt;Requires sign in to see the available work&lt;/li&gt;
&lt;li&gt;"Pull work" approach, the Worker is in control&lt;/li&gt;
&lt;li&gt;Nothing about disputes&lt;/li&gt;
&lt;li&gt;Has an alerting system&lt;/li&gt;
&lt;li&gt;Charge per piece of work&lt;/li&gt;
&lt;li&gt;10% commission&lt;/li&gt;
&lt;li&gt;"[..] elastic, scalable, on demand and pay-as-you-go development power [..]" &lt;a href="http://codemill.io/get-your-kernel-module-developed"&gt;source&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.bountysource.com/"&gt;BountySource&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;"Bountysource is the funding platform for open-source software"&lt;/li&gt;
&lt;li&gt;No support for private projects&lt;/li&gt;
&lt;li&gt;Unit of work is an Issue, with a link to a PR&lt;/li&gt;
&lt;li&gt;Bounties offered by users&lt;/li&gt;
&lt;li&gt;Bounties potentially from multiple users&lt;/li&gt;
&lt;li&gt;Not ties to a specific workflow&lt;/li&gt;
&lt;li&gt;Comprehensive integrations including GitHub, and it's open source&lt;/li&gt;
&lt;li&gt;10% commission &lt;a href="https://github.com/bountysource/core/wiki/Frequently-Asked-Questions#does-100-of-the-bounty-go-to-the-developer"&gt;as of 20 April 2017&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.upwork.com/"&gt;Upwork&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;"Work with someone perfect for your team"&lt;/li&gt;
&lt;li&gt;Unit of work is a project&lt;/li&gt;
&lt;li&gt;Bidding and proposal process (write a cover letter!)&lt;/li&gt;
&lt;li&gt;Reputation and reviews&lt;/li&gt;
&lt;li&gt;Work is mostly large, per-project&lt;/li&gt;
&lt;li&gt;Freelancers offer free consultations during bidding&lt;/li&gt;
&lt;li&gt;Act as Escrow, has complex dispute resolution&lt;/li&gt;
&lt;li&gt;Hourly charge, estimate number of hours&lt;/li&gt;
&lt;li&gt;2.75% + 20%/10%/5% commission &lt;a href="https://www.upwork.com/i/pricing/clients/"&gt;as of 20 April 2017&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.toptal.com/"&gt;Toptal&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;"Hire the top 3% of freelance talent"&lt;/li&gt;
&lt;li&gt;Hiring is based on passing their tests and interviews&lt;/li&gt;
&lt;li&gt;"interview [..] 40 hours of your time" &lt;a href="https://news.ycombinator.com/item?id=12303148"&gt;source&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;$500 deposit&lt;/li&gt;
&lt;li&gt;Charged per hour/week/etc, looks per-project&lt;/li&gt;
&lt;li&gt;Unclear how work is agreed upon&lt;/li&gt;
&lt;li&gt;Dispute process is unclear&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.linkedin.com/profinder"&gt;LinkedIn ProFinder&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;"ProFinder helps you hire top local freelancers"&lt;/li&gt;
&lt;li&gt;Proposal driven process, similar to Toptal&lt;/li&gt;
&lt;li&gt;Pricing: after 10 proposals, requires LinkedIn Premium Business account&lt;/li&gt;
&lt;li&gt;Beyond software development, they &lt;a href="https://www.linkedin.com/help/linkedin/answer/67202"&gt;mention accountants&lt;/a&gt; for example&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Usage
&lt;/h1&gt;

&lt;p&gt;Some people use these services &lt;a href="https://www.youtube.com/watch?v=NuqCJpzyK4g"&gt;as a springboard&lt;/a&gt;.&lt;/p&gt;

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