<?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: Vernon Joyce</title>
    <description>The latest articles on DEV Community by Vernon Joyce (@assaultoustudios).</description>
    <link>https://dev.to/assaultoustudios</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%2F37011%2F026733ff-0683-4ce3-ae83-4950ce342fc9.JPG</url>
      <title>DEV Community: Vernon Joyce</title>
      <link>https://dev.to/assaultoustudios</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/assaultoustudios"/>
    <language>en</language>
    <item>
      <title>Is front-end development having a identity crisis? — Part II</title>
      <dc:creator>Vernon Joyce</dc:creator>
      <pubDate>Sat, 13 Apr 2019 13:55:26 +0000</pubDate>
      <link>https://dev.to/assaultoustudios/is-front-end-development-having-a-identity-crisis-part-ii-107i</link>
      <guid>https://dev.to/assaultoustudios/is-front-end-development-having-a-identity-crisis-part-ii-107i</guid>
      <description>&lt;p&gt;Late in 2018 I wrote &lt;a href="https://hackernoon.com/is-front-end-development-having-an-identity-crisis-2dfcc5951192" rel="noopener noreferrer"&gt;&lt;em&gt;Is front-end development having an identity crisis&lt;/em&gt;&lt;/a&gt; as the first part of this series. I was surprised by how popular it was not because of it's obvious click-bait title (guilty); but by how well it resonated with the community. When I gave Part II as a talk early in 2019, the nods in the crowd were almost unanimous --- this is clearly something we need to talk about. Ultimately many developers feel the same: Front-end development as a role has become ambiguous.&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%2ACghLMb5sCmcWrFsbnCAIOg.jpeg" 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%2ACghLMb5sCmcWrFsbnCAIOg.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  A short summary of Part I
&lt;/h3&gt;

&lt;p&gt;Species evolve into many variants or sub-species as a result of natural selection. These sub-species all have different attributes and qualities and ultimately make each of them unique.&lt;/p&gt;

&lt;p&gt;Technology is no different. In a way, technology has given rise to hundreds of sub-species of programming languages, paradigms, frameworks and libraries, each with its own unique properties and challenges.&lt;/p&gt;

&lt;p&gt;Take JavaScript as an example.&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%2A7xr9moqDLrdDYJFCFDXnYw.jpeg" 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%2A7xr9moqDLrdDYJFCFDXnYw.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Credit to reddit user u/TheDoctorWumbology&lt;/p&gt;

&lt;p&gt;JavaScript has evolved into several massive technologies for both the back- and front-end. The problem with this is that the lines between front-end and back-end, or application and website, or designer and developer, have become blurry. The concept of "front-end development" has almost lost its meaning.&lt;/p&gt;

&lt;p&gt;So what is a front-end developer anyway? We need to ask ourselves three questions:&lt;/p&gt;

&lt;p&gt;1. What platform are we developing for? --- As developers we have the option of building for multiple platforms: Mobile, desktop, web or server. Front-end traditionally dealt with the user interface of an application but the rapid development of JavaScript has shifted the role into almost all of these platforms.&lt;/p&gt;

&lt;p&gt;2. What language are we developing in? --- This shift in platform contributed to the rise of technologies like React and Angular, each with their own set of rules and paradigms. Languages like PHP, Python and C# have also become part of the front-end stack in many organizations as they enable us to build services and APIs.&lt;/p&gt;

&lt;p&gt;3. What is my skill level and job title? --- The lack of clarity on platforms and languages result in a mixed bag of job specifications that takes away from our understanding of the title. Some front-end roles require back-end skills and some engineering roles require UI design skills. None of these roles are standardized.&lt;/p&gt;

&lt;h3&gt;
  
  
  So why does any of this matter?
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Ambiguous job specs
&lt;/h4&gt;

&lt;p&gt;In the example below, on the left, the developer is asked to know both Angular and Ionic. Granted there is some overlap between the two technologies, but they are both large frameworks each with their own nuances. Pair this with the graphic design requirement (which has nothing to do with front-end) and you've got yourself a very demanding role.&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%2Ao7olllyklODihvuRd-0DNA.jpeg" 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%2Ao7olllyklODihvuRd-0DNA.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Example of front-end job posts on LinkedIn. You can read more about my findings in Part I.&lt;/p&gt;

&lt;p&gt;The post on the right requires experience in Angular, Java, REST and MongoDB. This role is basically a full-stack, but the salary on offer is measly and the title of this role is &lt;em&gt;front-end developer.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Barrier to entry
&lt;/h4&gt;

&lt;p&gt;These job posts seem harmless, but they actually create a barrier to entry. Recently, a friend wanted to change his career path to something he felt was more future-proof--- so he asked me how he could get into web development.&lt;/p&gt;

&lt;p&gt;Honestly I had no idea what to tell him --- the road to master front-end is long and full of terrors. Is there even any benefit in learning HTML and CSS when you're just starting out, considering how demanding entry-level front-end roles are?&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%2ANSeeAcAhslCusHUVcEIGyw.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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2ANSeeAcAhslCusHUVcEIGyw.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I look at this ES6 snippet and honestly question how a junior is meant to memorize and understand this level of code. The reality is that this level of understanding has become an expectation for front-end developers and my view is that this leads to developers getting burnt out.&lt;/p&gt;

&lt;h4&gt;
  
  
  Burnout
&lt;/h4&gt;

&lt;p&gt;In 2016 I came to the conclusion that I would become obsolete as a front-end developer unless I jumped on the React or Angular bandwagon. I spent some time learning React and realized that I would have to include Node in my stack as well. At one point in time I was learning ES6, Node and React at the same time.&lt;/p&gt;

&lt;p&gt;This was &lt;em&gt;hard.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My days turned to 15 hours as I was juggling training and delivering massive projects at work. I was getting up earlier and getting less sleep and the stress of it all compounded. Yes, a year later I knew React and Node, but I was paying the price. This burnout had a massive impact on my personal life and my work and in a way I am still recovering.&lt;/p&gt;

&lt;h4&gt;
  
  
  Technical interviews
&lt;/h4&gt;

&lt;p&gt;Despite my burnout I was feeling confident in the skills I had learned so I started looking for new opportunities. React at the time was a rare skill in South Africa so I got invited to do interviews fairly quickly. The first interview is always easy, but I was not prepared for the technical interrogation that followed them.&lt;/p&gt;

&lt;p&gt;I prepared for these technical interviews but still flunked anyway.&lt;/p&gt;

&lt;p&gt;Technical interviews can be hard, especially if you are just starting out as a developer or if you are new to a technology. Technical interviews are important when hiring a developer, but they rely too heavily on our ability to remember technical jargon.&lt;/p&gt;

&lt;h4&gt;
  
  
  Job titles
&lt;/h4&gt;

&lt;p&gt;Let's say you ace your technical interview and get hired, now your title is *front-end developer. *You walk into your first meeting with stakeholders and the project manager asks the table to introduce themselves. Sally goes first: "I'm the head of digital and I look after the sales funnel of business unit X." Joe goes next and introduces himself as "the product owner and project lead". It's your turn and you mutter "I'm the front-end developer" under your breath.&lt;/p&gt;

&lt;p&gt;You instantly lose authority in that room.&lt;/p&gt;

&lt;p&gt;The reality is that titles do matter. They carry authority and with that authority comes things like compensation and career growth. Often circumstances force us to accept titles that don't necessarily fit our experience or outputs and this can quickly box us into a role.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do we solve this?
&lt;/h3&gt;

&lt;p&gt;Now that we understand the problem in a bit more detail, what can we actually do about it?&lt;/p&gt;

&lt;p&gt;Firstly we need to educate recruiters and organizations. Organizations often don't understand the roles they are hiring for and we are partly responsible for this.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Company leaders just hear stuff on YouTube or BuzzFeed and slap it into their job descriptions willy-nilly, not realizing that they're seeking a brilliant, made-up unicorn employee.\&lt;br&gt;
A comment by Ruth Reyer on dev.to, Part I of this series&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As team leaders, it is our responsibility to educate our organization and ensure that their job specifications are accurate to the role it needs to fill. We are also responsible as developers for questioning our roles and responsibilities and making our leaders aware of these discrepancies.&lt;/p&gt;

&lt;p&gt;Lastly we don't challenge recruiters enough. They cast a wide net on platforms like LinkedIn and very quickly dismiss you based on criteria that they don't even understand. I have personally found that recruiters are very open to hearing feedback on their job spec; and this feedback also positions you as an expert.&lt;/p&gt;




&lt;p&gt;We need to call roles what they are. Titles are muddy and lack hierarchy which can disable a developer's authority. This has a direct impact on our compensation and career growth.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I am really struggling with where I currently identify as a developer. I primarily do custom-built WordPress sites and am most fluent in HTML, CSS and JavaScript.\&lt;br&gt;
A comment by Jenna Schultz on dev.to, Part I of this series&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Organisations and leaders need to make a clear split between front-end, back-end, full-stack and software engineering as titles. This will help us standardize roles and responsibilities; and ensures that compensation associated with roles are fair.&lt;/p&gt;




&lt;p&gt;We need to reconsider the way we hire. Technical interviews are a necessary evil, but perhaps we should be testing the problem solving skills of a candidate rather than their memory.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tech deep divers are off the table for me. I only do conversational style interviews. I try to feel them out as much as possible but if I get in an interview and it slips into deep-dive I just say "I don't know" to everything and end it ASAP\&lt;br&gt;
A comment by Sean Anderson on dev.to, Part I of this series&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Test candidates in an environment similar to the one they will be working in. Most developers work in an environment where they can use resources like StackOverflow to solve problems, so why do we expect them to solve problems blindly under immense pressure and scrutiny?&lt;/p&gt;

&lt;p&gt;Rather than testing candidates on a phone call, give them a problem they can solve in the comfort of their home with all the tools they'll have access to at work. The problem doesn't have to be easy, but this will give you a good sense of the quality of code they write and their problem solving abilities. If you still need to do a telephonic technical interview, ask them questions that test their problem solving abilities rather than whether they can recite a for loop.&lt;/p&gt;

&lt;p&gt;Allow candidates to learn on the job --- lead them to success rather than expecting them to be rock stars from day one.&lt;/p&gt;




&lt;p&gt;Lastly remember to cut yourself some slack. We are all eternal students and often face the same challenges --- it takes practice and patience. Sometimes we just need to take a step back and remind ourselves to enjoy the journey.&lt;/p&gt;

&lt;h3&gt;
  
  
  Follow me
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://medium.com/@vernonjoyce" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://dev.to/assaultoustudios"&gt;Dev.to&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.linkedin.com/in/vernon-joyce-45b7624b/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://twitter.com/vj_hiriji" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>career</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Why designers should understand code</title>
      <dc:creator>Vernon Joyce</dc:creator>
      <pubDate>Sun, 03 Mar 2019 10:44:14 +0000</pubDate>
      <link>https://dev.to/assaultoustudios/why-designers-should-understand-code-487a</link>
      <guid>https://dev.to/assaultoustudios/why-designers-should-understand-code-487a</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qgNLNRZT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1200/1%2ATcTtHDvOevYBeoM5VzSa8w.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qgNLNRZT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1200/1%2ATcTtHDvOevYBeoM5VzSa8w.jpeg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As designers it's easy to get annoyed with developers. Perhaps they can't get the alignment of a button right; or that feature you deemed critical to your UX is just too far down the backlog for your comfort.&lt;/p&gt;

&lt;p&gt;The reality is that we get annoyed with developers mostly because we don't understand their world. The same goes for developers' lack of understanding of design --- they get pretty annoyed with us too.&lt;/p&gt;

&lt;p&gt;I know this because I've filled both shoes, having spent most of my life designing and developing for web.&lt;/p&gt;

&lt;p&gt;We're all guilty of it on some level. As designers we put our blue sky hats on and design to our heart's content without considering the technical implications.&lt;/p&gt;

&lt;p&gt;This doesn't necessarily mean we should restrict ourselves; but it does emphasize the importance of sticking to a project scope and ensuring alignment across your team.&lt;/p&gt;

&lt;p&gt;With that said, there might be cases where the scope supplied to you just isn't detailed enough. You start inventing functionality or components and often you might sell this to business without any technical consultation. This is dangerous and could easily result in scope creep and a final product that's delayed or over budget.&lt;/p&gt;

&lt;p&gt;Another likely scenario is when you're a one man show, designing in isolation. You expect the flat designs you hand over to be pixel perfect but this is hardly ever the case. Your developer does not care about user experience --- and this is completely fair because it's not their job.&lt;/p&gt;

&lt;p&gt;Unfortunately many companies are not mature enough in their design approach to avoid these scenarios. Engineering conversations are too often filled with jargon that designers don't understand, resulting in mixed deliverables. Design is also at times brought into the process when the engineering work is already done and when it's nearly impossible to make any design changes.&lt;/p&gt;

&lt;p&gt;Bridging this gap might require us, as designers, to know a little bit more about development.&lt;/p&gt;

&lt;p&gt;This is not to say that designers need to be full stack engineers, but I'm a firm believer in having a basic understanding of some technical concepts. It will reduce friction, help your team produce better products, and ultimately make you much better at your job.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data and data structures
&lt;/h3&gt;

&lt;p&gt;Data is the cornerstone of any application. Most applications might use what is called CRUD operations: Create, Read, Update and Delete. These operations are used to manage data, but the kicker is that functions or API calls need to be written for each of these operations, and often for each data set.&lt;/p&gt;

&lt;p&gt;In a designer's mind, adding an avatar picture to a profile section seems like a no-brainer. In reality though, a developer needs to write a full set of CRUD operations for this piece of design. Further to this they need to write code to link this avatar up to your profile, and provide a fallback image, and manage where the files are stored on a server. That small design change might have taken you five minutes, but could easily add a day or two to a sprint.&lt;/p&gt;

&lt;p&gt;There is also a second part to this: Where the actual data for this profile image is stored. Generally developers would design databases that are easy to scale, but sometimes we might force structure changes by designing new features.&lt;/p&gt;

&lt;p&gt;I'm very guilty of this one myself. I designed a web app that allowed you to find location based specials. After some feedback from users I realized that we were missing a very key feature: Customizing the same promotion for different stores. As a designer this problem was very simple to solve: I just had to add some buttons to the back-end and split out one of the admin processes. For the developers however it was a nightmare.&lt;/p&gt;

&lt;p&gt;The reality was that the database had to be redesigned and the admin processes rebuilt --- I couldn't afford this and my project fell out of budget and failed. This was not because the developers didn't know what they were doing, but because I had changed the scope.&lt;/p&gt;

&lt;p&gt;It's important that we are cognizant of the constraints when it comes to the design of an application's database, as well as the code required to read and write that data. Think about how pieces of data relate to one another; and remember that each piece of text you add to your design needs to live in a database table somewhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Asset generation and performance
&lt;/h3&gt;

&lt;p&gt;Most developers take the performance of their applications quite seriously --- I'm obsessed myself and count every millisecond I shave off as a champagne worthy victory.&lt;/p&gt;

&lt;p&gt;Performance is key to a good user experience, which means that the performance of your product is as much your job as it is a developer's. It is our responsibility as designers to hand over assets and prototypes that consider the application's performance and this is only possible with a solid understanding of the technology you are designing for.&lt;/p&gt;

&lt;p&gt;Imagery is one type of asset that a lot of designers don't hand over properly. It might be tempting to crank up that quality slider to 12 when saving out a JPG but at the end of the day your users will suffer for it. Most WordPress themes for example don't resize images when you upload or use them in production. Yes you can solve this with a plug-in or two, but why not just save it out correctly from the start?&lt;/p&gt;

&lt;p&gt;There are some very useful tools for testing image sizes (and services like Google Page Speed Insights even offer compression). Run your live site through these tools and supply your developers with the appropriate compressed images.&lt;/p&gt;

&lt;p&gt;Another consideration is SEO. Something simple, such as naming your file in a semantic way, can have a huge impact on your project's search rank. It might seem ridiculous to call that thumbnail 'a-photo-of-an-apple-on-a-cutting-board.jpg' but Google actually reads this metadata.&lt;/p&gt;

&lt;p&gt;Lastly this is not only applicable to imagery, but also video. Suggest a third-party service like YouTube or Vimeo --- your developers will love you for it as it does all the heavy lifting for them.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No, I can't improve the performance of your full page transition on IE6.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Another thing we're guilty of is overdoing animation. Sure, that transition might seem smooth and sexy on your iMac Pro but what about the rest of your audience that might be using old laptops? The same thinking goes for other devices like feature phones or older tablets.&lt;/p&gt;

&lt;p&gt;Animation can add a lot of bloat to code as developers might need to implement additional libraries to execute it. Additionally it might add unnecessary scope --- advanced shape animation for example would require HTML canvas which is often a specialist skill.&lt;/p&gt;

&lt;p&gt;It's important that animation is considered and meaningful. This will ensure that developers are implementing only animation that is relevant to your end-user's experience.&lt;/p&gt;

&lt;p&gt;You can read more about creating meaningful animation &lt;a href="https://uxplanet.org/animation-that-matters-adding-value-to-your-interface-65496fe4c182"&gt;here&lt;/a&gt;, or read more about analyzing performance &lt;a href="https://uxplanet.org/a-ux-review-framework-anyone-can-use-4218d4821d6c"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical execution
&lt;/h3&gt;

&lt;p&gt;When wearing my dev hat I sometimes receive designs that are hard to implement; and this is often because the designer does not fully understand what's involved in the implementation. CSS and JavaScript for example has its limitations --- there's just some native mobile features that can't be used for web. Then we also need to consider things like browser support, as well as the effort involved to make a design cross-browser compatible.&lt;/p&gt;

&lt;p&gt;With that said, most designs &lt;em&gt;are&lt;/em&gt; executable, it's just about finding a compromise between scope and what's best for the user. Having a solid understanding of CSS and the web will help this process along and will reduce friction between you and your developers.&lt;/p&gt;

&lt;p&gt;Ensure that your process is agile in nature --- check in with a developer on a regular basis to confirm that your design is executable and within scope.Designing quick prototypes is a great way to showcase your thinking and often your developers might use this to build prototypes of their own. This is great for collaboration and will avoid those design pitfalls.&lt;/p&gt;

&lt;p&gt;Lastly, never show final designs to a client without ensuring that they are executable and within your project's scope.&lt;/p&gt;

&lt;h3&gt;
  
  
  CSS and JavaScript frameworks or libraries
&lt;/h3&gt;

&lt;p&gt;Bootstrap was a turning point for many web professionals. It allowed developers to build websites without designers, and allowed designers to design in a language that developers could understand. In a way Bootstrap was one of the first design systems for the web and allowed for better collaboration between teams.&lt;/p&gt;

&lt;p&gt;Bootstrap uses a concept called CSS preprocessing. This allows developers to separate UI styles for different components into their own files. It also allows them to abstract certain properties out as variables, especially if they are repeatedly used in multiple components.&lt;/p&gt;

&lt;p&gt;React, Vue and Angular (all JavaScript frameworks/libraries) follow very similar methodologies. These data driven, Single Page Application tools have enabled developers to build highly scale-able web applications that are very modular in nature. Components are separated into their own functional files and often contain the styling (CSS) as well.&lt;/p&gt;

&lt;p&gt;Understanding this concept of separation of concerns allow designers to abstract their design work into design tokens, which creates a shared language that both designers and developers can understand.&lt;/p&gt;

&lt;p&gt;This shared language is a powerful tool that eliminates jargon from the conversation. It empowers designers to be part of project scoping and sprint planning. There would be no doubt between you and your developer when you ask them to change a button from 'small' to 'large', as the component and it's relevant styling is abstracted out. This ultimately could lead to a design system, which allows design to roll out at scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  To conclude
&lt;/h3&gt;

&lt;p&gt;I'm not saying that designers need to be hard-core developers, but a little understanding goes a long way. Learn from developers and help them learn from you, so that we can all build better products.&lt;/p&gt;

&lt;h3&gt;
  
  
  Follow me
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://medium.com/@vernonjoyce"&gt;Medium&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://dev.to/assaultoustudios"&gt;Dev.to&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.linkedin.com/in/vernon-joyce-45b7624b/"&gt;LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://twitter.com/vj_hiriji"&gt;Twitter&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ux</category>
      <category>design</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How do YOU deal with burnout?</title>
      <dc:creator>Vernon Joyce</dc:creator>
      <pubDate>Sat, 12 Jan 2019 07:09:22 +0000</pubDate>
      <link>https://dev.to/assaultoustudios/how-do-you-deal-with-burnout-5hme</link>
      <guid>https://dev.to/assaultoustudios/how-do-you-deal-with-burnout-5hme</guid>
      <description>&lt;p&gt;Early 2018 I launched what I considered to be the largest project I had ever worked on. It involved many late nights over the course of 20 months and a painful amount of dev work. I had been the lead front-end developer, the solution architect, a client manager and a project manager. Filling all of these roles was not easy and we would often joke about how empty our lives would be once we launched. &lt;/p&gt;

&lt;p&gt;I had no idea.&lt;/p&gt;

&lt;p&gt;After an opportunity to reflect in December I realised that eight months later, I had still not recovered from this project. &lt;/p&gt;

&lt;p&gt;I am burnt out.&lt;/p&gt;

&lt;p&gt;My questions to the community, as I'm sure you've had similar experiences: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are you burnt out right now?&lt;/li&gt;
&lt;li&gt;How do you deal with your burnout? &lt;/li&gt;
&lt;li&gt;How do you carry on working when the deadlines keep coming? &lt;/li&gt;
&lt;li&gt;How do you recover when you need to pay the bills? &lt;/li&gt;
&lt;li&gt;How long did it take you to recover?&lt;/li&gt;
&lt;li&gt;How do you keep up with new tech if your day job seems overwhelming as it is?&lt;/li&gt;
&lt;li&gt;How do you deal with the depression?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As developers we put unnecessary pressure on ourselves. Pressure to keep learning, to innovate, to keep going. We never stop to talk about the hard things and I don't think there is enough awareness for how badly developers are affected by burnout. &lt;/p&gt;

&lt;p&gt;Let's discuss.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>career</category>
    </item>
    <item>
      <title>What no one tells you about working at corporates</title>
      <dc:creator>Vernon Joyce</dc:creator>
      <pubDate>Mon, 29 Oct 2018 09:38:15 +0000</pubDate>
      <link>https://dev.to/assaultoustudios/what-no-one-tells-you-about-working-at-corporates-hli</link>
      <guid>https://dev.to/assaultoustudios/what-no-one-tells-you-about-working-at-corporates-hli</guid>
      <description>&lt;p&gt;While freelancing I was often told to avoid the big bad corporate. “You’ll be a slave” is something I would often hear from people having “done their time”.&lt;/p&gt;

&lt;p&gt;I shared this belief for a very long time.&lt;/p&gt;

&lt;p&gt;I had a hard time working for someone else and often left jobs to freelance or run a business. My start-ups would fail and I would struggle to find clients all while trying to pay the bills. I would then lapse back into working for small companies where the cycle would repeat itself and my frustrations would grow.&lt;/p&gt;

&lt;p&gt;Even though I felt that the grass was not always greener on the other side, I eventually came to realize that at the very least the grass might be less dead.&lt;br&gt;
Every job or company has its pros and cons and not all of them are created equal. A large corporate, like most businesses, is a complicated organism made up of complicated parts: Culture, hierarchy, politics, infrastructure, processes, regulations… All of these factors give an organization its identity.&lt;/p&gt;

&lt;p&gt;Eventually the stress and anxiety of working for myself made the decision to move to corporate much easier. I applied for a developer role with much less responsibility than I currently had — with the goal to lesson my workload.&lt;/p&gt;

&lt;p&gt;All I needed was to find a company with the right type of personality— attributes that suited my career aspirations and interests — the right mix of opportunities.&lt;/p&gt;

&lt;p&gt;I realized very quickly after starting this new role that I was never prepared to run a business, but more importantly, that I had just walked into a world of opportunity.&lt;/p&gt;

&lt;p&gt;Corporates have a lot to offer and I would like to share some of my learnings, as a designer and developer, in an effort to help those that are unsure about whether corporate should be their next move.&lt;/p&gt;

&lt;h2&gt;
  
  
  Culture and interaction
&lt;/h2&gt;

&lt;p&gt;Culture sits at the heart of an organization and gives it its unique personality. Without culture a corporate would be a soulless factory, and you truly would be a slave. It is what makes Apple and Google such desirable employers; even though they offer completely different working experiences.&lt;/p&gt;

&lt;p&gt;As humans we need social interaction and support.&lt;/p&gt;

&lt;p&gt;While freelancing I often felt isolated while sitting at home with just my thoughts and pressing deadlines. This lead to frustration and depression and ultimately my work suffered. Working at home requires a lot of discipline and at the time I refused to admit to myself that I needed help.&lt;/p&gt;

&lt;p&gt;Corporate culture was what I needed — to be part of something bigger.&lt;/p&gt;

&lt;p&gt;There is something meaningful to belonging to this organism, whether you’re chanting a corporate mantra or part of a team vital to executing an executive strategy.&lt;/p&gt;

&lt;p&gt;In reality you cannot experience corporate culture at this level as an outsider. There is the surface level stuff that you might get access to as a contractor: casual days, Friday beers, year-end parties… but this happens very rarely and you never really build comradeship with colleagues. Outsiders rarely get to experience the values and behaviors that truly build a company’s unique environments.&lt;br&gt;
Google has an excellent understanding of people’s wants and needs; offering flexible hours, creative freedom, organizational trust and access to incredible people; all of which won them best corporate culture in 2018.&lt;/p&gt;

&lt;p&gt;Other cultural activities could include extramural sports teams, meetups, internal talks or sharing sessions, clubs. Google’s award winning culture.&lt;/p&gt;

&lt;p&gt;If you still prefer working remotely then you might be in luck as many corporates have started adopting a work from home policy. These policies vary, but some might even allow you to work from home five days a week provided you are available for important meetings. Working from home, for a corporate, also has some advantages over working remotely as a freelancer as you still get to experience the culture on some level.&lt;/p&gt;

&lt;p&gt;Not all companies have good culture and a toxic environment could leave you wanting to leave. The good news is that culture is only one aspect of what makes corporates great; and there is still so much more to learn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Institutional knowledge
&lt;/h2&gt;

&lt;p&gt;It should no longer be a surprise to you; but machines are coming for our jobs. I’m not necessarily talking about Skynet; but the reality is that robotics and AI are improving at an almost uncomfortable pace and we need to be prepared.&lt;/p&gt;

&lt;p&gt;One of the ways you could future proof yourself is by acquiring extensive institutional knowledge. A better understanding of how a business works, at scale, could eventually see you move from an execution or production role to a consultative or strategic role — which is much harder to automate.&lt;/p&gt;

&lt;p&gt;As a developer I’ve gained copious amounts of institutional knowledge on various topics: IT infrastructure, server maintenance, different programming languages, change management, operations, traffic, business strategy… I am by no means an expert in any of these specialities but I know enough to make critical decisions about my career.&lt;/p&gt;

&lt;p&gt;This knowledge could come from various sources, but generally you accrue this over time just by doing your day job and interacting with systems and people. It’s an incredible feeling; piecing together this institutional puzzle as you gain more and more exposure to its different parts.&lt;/p&gt;

&lt;p&gt;A good source of information could also be an innovation or research department. Many larger organizations will have one and they will be open to sharing their learnings with others; whether it’s interesting new tech, big data or access to proof of concepts. Collaboration is also a common theme in innovation and research; so don’t be surprised if you spot an opportunity to work on interesting projects for the benefit of the company.&lt;/p&gt;

&lt;p&gt;These are only some examples of informative sources you’ll have access to at a large organization. This is not to say you won’t learn anything while working for yourself, but it is called institutional knowledge for a reason. They have more resources, larger budgets and most importantly, many employees to network with.&lt;/p&gt;

&lt;h2&gt;
  
  
  Networking
&lt;/h2&gt;

&lt;p&gt;Firstly know that you do not need to be an extrovert to network with people in an organization. This is because networking is not about making friends, but allies that align to your values and principals. This is not to say that friendship is not a potential outcome, but it should not be an objective.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The currency of real networking is not greed but generosity. @Ferazzi (Twitter)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The above quote perfectly sums up my experience of networking: It is a result of the value you add to the lives of people in your organization.&lt;/p&gt;

&lt;p&gt;Just like you; people have their own agendas and needs. Whether it is career advancement, getting a project over the line or just making it through the day. Strong networks are built by helping other people meet their needs. What you gain in return is their trust; and the likelihood that they will one day return the favor.&lt;/p&gt;

&lt;p&gt;This is not to say that you cannot network outside of a corporate environment, but I find it much easier. You have access to thousands of talented people from all walks of life and levels of experience, in a setting that fosters collaboration.&lt;/p&gt;

&lt;p&gt;That said, networking might be much harder in some corporates than others, and this is largely dependent on the value it places on hierarchy and the overall corporate culture. You might not have access to other teams or departments due to the institution’s structure— but there are ways around this.&lt;/p&gt;

&lt;p&gt;If you have won the trust of your manager, team leader or colleagues they might take you along to important meetings; giving you the opportunity to add value. There is also no harm in asking directly to be invited to a meeting, especially if you know you can add value. You might find your colleagues are quite receptive as long as it is relevant to your field of work and your intentions are honest and clear.&lt;/p&gt;

&lt;p&gt;Another way to grow your network is through problem solving. Computer not starting up? No problem, you get to meet someone from your IT department. When you are faced with challenges in your day job you are given the opportunity to interact with people capable of helping you solve these problems and most people are very open to helping others.&lt;/p&gt;

&lt;p&gt;Also never underestimate the value of a shared lunch area. It is true that smokers make a lot of friends and for good reason — nothing brings people together like shared values and interests — especially in a captured space.&lt;/p&gt;

&lt;p&gt;Lastly, and this might seem obvious, but consistently connect with as people you meet on LinkedIn. Send an invite after a meeting whilst their memory of you is recent and be sure to personalize the request with a message. Stay active by sharing content that is relevant to you and your network to maximize your exposure and grow your reputation.&lt;/p&gt;

&lt;p&gt;Building a network takes time but is immeasurably valuable. Be patient; don’t job hop too often and give those relationships time to grow. The partnerships you form at a corporate could very well be the cornerstone for that promotion you want.&lt;/p&gt;

&lt;h2&gt;
  
  
  Career growth
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Chaos isn’t a pit. Chaos is a ladder. Many who try to climb it fail and never get to try again. The fall breaks them. Only the ladder is real. The climb is all there is.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes the agendas of others might make you feel like you are stuck in Game of Thrones. Quoting Littlefinger might seem dramatic, but in reality if you plan on staying in corporate then the climb might very much be one of your primary objectives.&lt;/p&gt;

&lt;p&gt;As you grow your network you will be presented with opportunities to move to new teams or be promoted into new roles. These decisions are often difficult and might require you to make sacrifices. Consider your team and remember that loyalty is often rewarded.&lt;/p&gt;

&lt;p&gt;The corporate ecosystem is built to perpetuate success. As you climb the corporate ladder you will get more exposure to culture, gain more insight and knowledge, grow your network and identify more opportunities.&lt;/p&gt;

&lt;p&gt;If you are not interested in the political game then perhaps you could take up some of the training and advancement opportunities your Human Resources department offers. Remember that you are an investment and leaders want to see you succeed; which is why large corporates will have budget allocated for training. Other programmes could include mentorship or coaching; or even scholarships for further studies.&lt;/p&gt;

&lt;p&gt;Lastly make sure your LinkedIn profile is up to date and professional. When working for a reputable company you might get bombarded by recruiters wanting a piece of you, especially if your skills are in high demand. This is not to say that you should be entertaining every single offer; but grab the opportunity to grow your network and keep an eye out for offers you can’t refuse.&lt;/p&gt;

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

&lt;p&gt;It goes without saying that there are many other benefits to working at a larger company. I’ve covered some of the not-so-obvious ones, but there are plenty more:&lt;/p&gt;

&lt;p&gt;Competitive salaries&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yearly compensation&lt;/li&gt;
&lt;li&gt;Additional leave (including family responsibility)&lt;/li&gt;
&lt;li&gt;Subsidized services and products (food, dry cleaning, medical etc.)&lt;/li&gt;
&lt;li&gt;On premise services like grocery stores or gyms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are only to name a few; all aimed at making it easier to maintain a work life balance.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s next?
&lt;/h2&gt;

&lt;p&gt;If you find yourself questioning what you do, like I did, you might consider broadening your horizons by applying to a corporate. Or perhaps you are already working at one and you weren’t aware that there truly is greener grass on the other side.&lt;/p&gt;

&lt;p&gt;Many people eventually leave corporates to build start-ups, businesses or very successful freelance careers. Could they have done it without their corporate experience? Perhaps.&lt;/p&gt;

&lt;p&gt;My question is, what do you really have to lose?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This article is purely based on my personal experiences and biased opinions — I would love to hear your views down in the comments.&lt;/p&gt;

&lt;p&gt;Vernon Joyce, a full-stack unicorn&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>career</category>
      <category>discuss</category>
      <category>tips</category>
    </item>
    <item>
      <title>Is front-end development having an identity crisis?</title>
      <dc:creator>Vernon Joyce</dc:creator>
      <pubDate>Sun, 09 Sep 2018 12:53:53 +0000</pubDate>
      <link>https://dev.to/assaultoustudios/is-front-end-development-having-an-identitycrisis-2224</link>
      <guid>https://dev.to/assaultoustudios/is-front-end-development-having-an-identitycrisis-2224</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg3kpnovsc3w1uw4imevv.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg3kpnovsc3w1uw4imevv.jpeg" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Courtesy Adobe Stock&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Does front-end development as a we know it still exist; or has the role evolved into something we no longer recognise? As with evolution in nature, the evolution of "front-end" has resulted in several distinct flavours --- and in my opinion --- an identity crisis.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a front-end developer anyway?
&lt;/h2&gt;

&lt;p&gt;Traditionally speaking the front-end could be defined as the UI of an application, i.e. what is client-facing. This however seems to have shifted in recent years as employers expect you to have more experience, know more languages, deploy to more platforms and often have a 'relevant computer science or engineering degree'.&lt;/p&gt;

&lt;p&gt;Frameworks like Angular or libraries like React require developers to have a much deeper understanding of programming concepts; concepts that might have historically been associated only with the back-end. MVC, functional programming, high-order functions, hoisting... hard concepts to grasp if your background is in HTML, CSS and basic interactive JavaScript.&lt;/p&gt;

&lt;p&gt;This places an unfair amount of pressure on developers. They often quit or feel that there is no value in only knowing CSS and HTML. Yes technology has evolved and perhaps knowing CSS and HTML is no longer enough; but we have to stop and ask ourselves what it really means to be a front-end developer.&lt;/p&gt;

&lt;p&gt;Having started out as a designer I often feel that my technical knowledge just isn't sufficient. 'It secures HTTP requests and responses' wasn't deemed a sufficient answer when asked what an SSL certificate was in a technical interview for a front-end role. Don't get me wrong, these topics are important, but are these very technical details relevant to the role?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I will be occasionally referring to front-end development as FED from here on.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;This identity crisis is perpetuated by all parties: organisations, recruiters and developers. The role has become ambiguous with various levels of responsibility, fluctuating pay scales and the lack of a standardised job specification within the industry.&lt;/p&gt;

&lt;p&gt;While looking at the job market you might find that organisations expect employees to be unicorns and fill multiple shoes. Recruiters also could have unrealistic expectations in terms of the role which is often supplied by a Human Resources department with little understanding of what they are hiring for. Lastly developers compound this problem ourselves: they accept technical interviews as they are and should we get the job we place ourselves under unnecessary pressure to learn the missing skills, instead of challenging recruiters and organisations on what it actually means to be a front-end developer.&lt;/p&gt;

&lt;p&gt;Compare the below job posts on LinkedIn, both titled 'Front-end Developer'. The roles are vastly different: on the one hand the developer is expected to know Flux architecture and unit testing while on the right they are expected to know Java and MongoDB.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9n7q9ih21jdyaryorct.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9n7q9ih21jdyaryorct.jpeg" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comparing two roles on LinkedIn, both labelled "Front-end developer"&lt;/p&gt;

&lt;p&gt;Both of these roles are vastly different; and clearly lack a definitive scope or the role.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it is important to standardise the role
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; Evening out the pay scale: front-end engineers won't get paid what &lt;em&gt;FEDs&lt;/em&gt; should and vice versa.&lt;/li&gt;
&lt;li&gt; Alleviates pressure; allowing developers to either focus on engineering products or on creating rich interactive web experiences&lt;/li&gt;
&lt;li&gt; It creates specialists; developers who are really good at CSS, HTML and interactive JavaScript&lt;/li&gt;
&lt;li&gt; Makes job hunting less stressful when it comes to technical interviews and job specifications&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Separation of concerns
&lt;/h2&gt;

&lt;p&gt;In order to define the role we have to strip out all the roles that could be considered above and beyond the scope of a &lt;em&gt;FED&lt;/em&gt;. The web developer role, for example, should not be confused with the &lt;em&gt;FED&lt;/em&gt; role as the one builds applications and the other builds experiences. Other examples include front-end designer, web engineer, back-end web developer etc.&lt;/p&gt;

&lt;p&gt;To distinguish these roles we could look at four criteria:&lt;/p&gt;

&lt;h4&gt;
  
  
  The developer's canvas
&lt;/h4&gt;

&lt;p&gt;If we were to make the assumption that the primary context for front-end is the browser --- where would that leave PHP or C# developers on the spectrum? PHP is a good example; yes it runs on a server but ultimately still delivers data to a UI (i.e. the browser). Both JavaScript and PHP are scripting languages that don't require compilation. Is a PHP developer then considered a front-end developer or a back-end developer?&lt;/p&gt;

&lt;p&gt;Tools like Github's Electron allows a developer to build cross platform desktop apps from HTML, CSS and JavaScript. Similarly tools like Adobe Phonegap make it possible to compile HTML pages with JavaScript to native mobile applications. This essentially enables an intermediate front-end developer to build and publish mobile or desktop apps. Could app development then be added to the scope of a front-end developer's responsibilities?&lt;/p&gt;

&lt;p&gt;The lines between back-end and front-end became blurry somewhere between JQuery and Node and ever since it's often expected for front-end developers to know Node and accompanying packages like Express. These are clearly back-end technologies, so why are we adding them to a &lt;em&gt;FEDs&lt;/em&gt; job specification?&lt;/p&gt;

&lt;p&gt;Before we can standardise the role we have to agree on what the front-end developer's canvas is. In my view, this is confined to the UI of an application and primarily runs in a browser --- the role should not be concerned with building any server side functionality.&lt;/p&gt;

&lt;h4&gt;
  
  
  The chosen language
&lt;/h4&gt;

&lt;p&gt;A second criteria to consider might be a developer's chosen programming language. It is possible to build website infrastructure in languages like Python and C# which begs the same question as before --- could Python, PHP and C# be considered a front-end language?&lt;/p&gt;

&lt;p&gt;The below example asks for PHP as a required skill where the other expects the developer to know TypeScript.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fya1f6o259vyiy8od9y1g.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fya1f6o259vyiy8od9y1g.jpeg" width="800" height="652"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comparing the skills required for two roles on LinkedIn, both labelled "Front-end developer"&lt;/p&gt;

&lt;p&gt;JavaScript can now do much of what PHP and Python can do; with popular libraries like TensorFlow becoming available to JS developers. Another example includes TypeScript (as above), which brings static typing to JavaScript from languages like Java. Where do we draw the line then in terms of what is considered a front-end language or framework?&lt;/p&gt;

&lt;p&gt;Which frameworks or libraries then should be part of the role's scope if we are excluding PHP, C#, Java etc? JQuery for example is a the perfect tool for building interactivity for the web, where most front-end developers might argue that it's better to learn Vue.&lt;/p&gt;

&lt;p&gt;Libraries like React on the other hand requires a developer to learn concepts that traditionally were not associated with the front-end: setting up webpack and transpilation, deployment processes, understanding high-order components and just for fun you might throw in state management with Redux. The list grows quickly; and although this all uses JavaScript as a language the understanding that comes with it is often very different.&lt;/p&gt;

&lt;p&gt;Many back-end developers have told me that they find CSS very difficult and I agree --- CSS is hard! We forgive back-end developers for not knowing CSS and interactive JavaScript; why then is there an expectation for front-end developers to know back-end technologies?&lt;/p&gt;

&lt;p&gt;The question we should ultimately be asking is whether a front-end developer should be dealing with functional or data driven components at all. In my view, the role's language choice should only be HTML, CSS and JavaScript (limited to front-end libraries), primarily used to build interactive components or web projects that consume data from services where necessary.&lt;/p&gt;

&lt;h4&gt;
  
  
  The skill-level
&lt;/h4&gt;

&lt;p&gt;When does a front-end developer transition into a full-stack developer or a web developer?&lt;/p&gt;

&lt;p&gt;Distinguishing this becomes really easy when considering the &lt;em&gt;canvas&lt;/em&gt; as well as the &lt;em&gt;chosen language.&lt;/em&gt; A full-stack developer is a developer that understands both front-end and back-end (i.e deals with more than one &lt;em&gt;canvas).&lt;/em&gt; A web developer is a developer that can work in multiple &lt;em&gt;frameworks, libraries and languages&lt;/em&gt; to build rich data driven applications. Most &lt;em&gt;FEDs&lt;/em&gt; will then most likely move from an intermediate &lt;em&gt;FED&lt;/em&gt; role to a senior full-stack, engineer etc. role.&lt;/p&gt;

&lt;p&gt;Is it then possible to be a &lt;em&gt;senior front-end developer&lt;/em&gt; when considering our role definition up to now? My argument is yes. Simply look at any winning website on &lt;a href="https://www.awwwards.com/websites/" rel="noopener noreferrer"&gt;Awwwards&lt;/a&gt; and you'll quickly agree that this level of interactivity requires a very good understanding of the DOM and DOM manipulation via JavaScript. &lt;em&gt;FEDs&lt;/em&gt; also then have an opportunity to focus on learning libraries that build interactive features (for example HTML canvas, WebGL) as opposed to back-end libraries or frameworks that takes them away from what got them started as a &lt;em&gt;FED&lt;/em&gt; in the first place.&lt;/p&gt;

&lt;h4&gt;
  
  
  Other specialties
&lt;/h4&gt;

&lt;p&gt;The last factor to consider are all the additional requirements that come with front-end roles. I consider this 'baggage' mostly because these requirements often get thrown into the mix in an ad-hoc fashion.&lt;/p&gt;

&lt;p&gt;A good example of this is MongoDB (which was a requirement in the listing mentioned earlier). Previously database administration or architecture was a role in itself, so why now are we expecting &lt;em&gt;FEDs&lt;/em&gt; to have this skill set on top of everything else?&lt;/p&gt;

&lt;p&gt;Another example from an earlier screenshot is the listed &lt;em&gt;graphic design&lt;/em&gt; requirement. Personally I am a big advocate of developers &lt;strong&gt;understanding&lt;/strong&gt; design, but expecting them to have it as a skill on top of their other &lt;em&gt;FED&lt;/em&gt; skills changes the role into something else (perhaps a front-end designer or full-stack designer).&lt;/p&gt;

&lt;p&gt;When considering the added responsibility that comes with having all this knowledge, we have to ask ourselves whether adding them into the mix only complicates the landscape. If today I decided to bring React into my organisation, the developer they choose to replace me with would have to know React as well. If the new developer then decides to add Redux to the mix... well you understand where this is going. To make matters worse, they will keep on hiring &lt;em&gt;front-end developers&lt;/em&gt; regardless of the technology used because that is the role required by the department.&lt;/p&gt;

&lt;p&gt;So with great power &lt;strong&gt;does&lt;/strong&gt; come great responsibility and it is ultimately up to us as developers to use technology responsibly. Consider the operational impact of a technology stack change and understand that you might be perpetuating an existing problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Defining the role
&lt;/h2&gt;

&lt;p&gt;Now that we've unpacked what it means to be a front-end developer, we could write the following job description:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A front-end developer is responsible for building interactive user interfaces or experiences for the web using HTML, CSS and JavaScript.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's keep things simple --- a &lt;em&gt;FED&lt;/em&gt; should not need to understand functional programming or how SSL works on a micro technical level. This is not to say that they shouldn't learn these concepts; but at the very least it shouldn't be an expectation.&lt;/p&gt;

&lt;p&gt;I feel that it is important that we collectively address the confusion surrounding the roles in the development community by helping the next generation of front-end developers understand what it means to be a &lt;strong&gt;FED&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This article is purely based on my personal experiences and biased opinions --- I would love to hear your views down in the comments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vernon Joyce, a full-stack unicorn.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Give me some love on my other channels
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/vernon-joyce-45b7624b/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
&lt;a href="https://medium.com/@vernonjoyce" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;br&gt;
&lt;a href="https://twitter.com/vj_hiriji" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>career</category>
      <category>discuss</category>
    </item>
    <item>
      <title>A UX review framework anyone can use</title>
      <dc:creator>Vernon Joyce</dc:creator>
      <pubDate>Wed, 20 Jun 2018 14:29:06 +0000</pubDate>
      <link>https://dev.to/assaultoustudios/a-ux-review-framework-anyone-can-use-bhn</link>
      <guid>https://dev.to/assaultoustudios/a-ux-review-framework-anyone-can-use-bhn</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;As connected products are integrated into more aspects of our day to day lives, UX will be responsible for translating strategy into intuitive experiences.&lt;/p&gt;

&lt;p&gt;Forbes&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The demand for UX has become clear as organisations rush to create products that put client needs before business needs. These organisation often have large UX and design teams who focus solely on providing the best possible experience to their customers.&lt;/p&gt;

&lt;p&gt;But what if you or your business cannot afford to hire a UX designer to review your product or service?&lt;/p&gt;

&lt;p&gt;My goal for sharing this framework is to allow anyone to do a UX review; whether you are a UX designer or not. You can use this framework to analyse a product or service* or analyse a piece of work for a potential client. You could even use this to review your own work as the tools and techniques I use leave little room for bias.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Although this framework can be used for any type of product or service, it will primarily focus on web.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;**&lt;em&gt;There are plenty of dev goodies in this article - it's not purely meant for designers.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Objectives of the review
&lt;/h3&gt;

&lt;p&gt;It's important to start your review by positioning your objectives. This sets the tone and ensures that both you and your stakeholder have the same expectations --- whether you are presenting your review or sending it via email.&lt;/p&gt;

&lt;p&gt;Some objectives or outcomes could include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Identify opportunities&lt;/li&gt;
&lt;li&gt; Substantiate design changes&lt;/li&gt;
&lt;li&gt; Identify technical issues&lt;/li&gt;
&lt;li&gt; Discuss UX improvements&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These objectives will mostly relate to your initial briefing --- why did your client want you to do a UX review in the first place?&lt;/p&gt;




&lt;h3&gt;
  
  
  Business objectives
&lt;/h3&gt;

&lt;p&gt;Business objectives are what your client is trying to achieve. Sometimes objectives can easily be ascertained by yourself but they could also require additional research. In the case of research it depends on your client --- sometimes their objectives are obvious but often there are deeper needs that need to be brought to the surface through further inspection.&lt;/p&gt;

&lt;p&gt;Unpacking these objectives is important --- let's take *increasing sales *as an example. Are they trying to sell more of a specific product or perhaps drive in-store traffic? These details are important as it makes your outcomes much more tangible and measurable. It is much easier to credit a sales increase of a specific product to a UX improvement, than to match a sales increase of a thousand products to an objective that has not been properly defined.&lt;/p&gt;

&lt;p&gt;These objectives can be unpacked by conducting interviews with your client and their stakeholders and additional objectives could also be identified through market research. A simple survey through &lt;a href="http://surveymonkey.com/" rel="noopener noreferrer"&gt;Survey Monkey&lt;/a&gt; can provide valuable insights if you have access to your stakeholder's clients.&lt;/p&gt;

&lt;p&gt;Lastly, state these objectives in your review to remind your client of the problems you are trying to solve. This will reaffirm your thinking throughout the review and give your ideas credibility.&lt;/p&gt;




&lt;h3&gt;
  
  
  Personas and userflows
&lt;/h3&gt;

&lt;p&gt;Now that you understand the business' needs, it's time to look at the user's needs. A popular way of unpacking user needs is by creating personas or persona sheets. In short a persona is a fictional user with needs, aspirations and desires that are usually linked to objectives within their lives.&lt;/p&gt;

&lt;p&gt;Take Sandy for example. She is a middle-class professional female with a family of two. She likes learning about technology, watching documentaries and spending time with her children. Sandy is an ideal customer for a geeky toy shop, where she can purchase an electronic toy that both her and her children can enjoy.&lt;/p&gt;

&lt;p&gt;Creating personas can be daunting but become an invaluable tool. Personas can be set up through research along with a firm understanding of you or your stakeholder's business objectives. &lt;a href="https://medium.com/@shanepwilliams" rel="noopener noreferrer"&gt;Shane Williams&lt;/a&gt; offers a comprehensive look at creating personas in &lt;a href="https://medium.com/@shanepwilliams/getting-started-with-creating-personas-questions-to-ask-b15689e3eb91" rel="noopener noreferrer"&gt;Getting started with creating personas --- questions to ask&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now that we know who your users are, it's time to look at the steps they would take to achieve their goals. This can be done by creating userflow diagrams. These diagrams demonstrate sample user journeys based on your user's objectives and can often be combined with business objectives for a full client experience view.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F544chch8zu74hyxw4ewy.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F544chch8zu74hyxw4ewy.jpeg" width="800" height="634"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Example of user flow diagram
&lt;/h6&gt;

&lt;p&gt;There are many ways to create these diagrams, whether using sticky notes or an online tool like &lt;a href="https://www.draw.io/" rel="noopener noreferrer"&gt;Draw.io&lt;/a&gt;. There are no rules when it comes to designing these diagrams --- but it is important that your diagrams are easy to follow and read-able.&lt;/p&gt;




&lt;h3&gt;
  
  
  Working with data
&lt;/h3&gt;

&lt;p&gt;Data is the cornerstone of a good UX review and without it you might find it difficult to back up your findings. Google analytics offers a great starting point for user interaction data, provided you know what you are looking for.&lt;/p&gt;

&lt;p&gt;Something as simple as a drop in traffic on a given day could indicate a problem --- perhaps users had a negative reaction to a new feature or maybe you posted something on social media that got negative press.&lt;/p&gt;

&lt;p&gt;Device information (such as mobile vs desktop traffic) could also be meaningful when deciding on which device to focus your usability assessment.&lt;/p&gt;

&lt;p&gt;Event tracking in Google Analytics provides another helpful source of information assuming it has been set up correctly. &lt;a href="https://www.crazyegg.com/" rel="noopener noreferrer"&gt;CrazyEgg &lt;/a&gt;is a great alternative should you not have the expertise to set up event tracking in GA as it offers heatmaps for both clicks and scroll on different devices.&lt;/p&gt;

&lt;p&gt;The behavior flow report is also invaluable and offers insights into the journey users take in the form of a flow diagram. It provides data on drop-offs, sessions and more with the ability to highlight or analyse specific user paths.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fegbcbjz6yz2mb9b0odd1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fegbcbjz6yz2mb9b0odd1.png" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Example of Google Analytics' behavioural flow diagrams
&lt;/h6&gt;

&lt;p&gt;Conducting &lt;a href="https://www.usability.gov/how-to-and-tools/methods/system-usability-scale.html" rel="noopener noreferrer"&gt;System Usability Scale (SUS)&lt;/a&gt; surveys is also a handy way to quickly gauge the usability of a system through user feedback. SUS tests can be conducted on products, websites, apps or software and provide a scaled result regardless of the volume of feedback. The SUS survey's data is also useful going into the usability review.&lt;/p&gt;

&lt;p&gt;Lastly the persona sheets you set up in the previous section are also an excellent source of data. Keep your user objectives in mind when examining any of these data sources and you might find behavioural patterns that indicate a gap in the user's journey.&lt;/p&gt;

&lt;p&gt;You or your client might not always have data tools set up. In these cases my advice would be to postpone the review until you have meaningful analytics to work with. Installing GA is quick and easy and should give you relevant insights after only a month.&lt;/p&gt;




&lt;h3&gt;
  
  
  Usability review
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Usability rules the Web. Simply stated, if the customer can't find a product, then he or she will not buy it.&lt;/p&gt;

&lt;p&gt;Jakob Nielsen&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Usability speaks to the core of the review --- is the product usable?&lt;/p&gt;

&lt;p&gt;It's time to make some assumptions about the usability of your project based on business and user needs. Step into the shoes of your users using your persona sheets, userflows and analytical data. Start using the application or service on different devices, browsers or operating systems while following your userflows. You will quickly pick up on journeys that are possibly frustrating or pieces of functionality that do not help you achieve your objective as the user.&lt;/p&gt;

&lt;p&gt;You might also come across design flaws, broken or confusing components or responsive issues. Jot all of these potential problems down while taking screen shots. Once you have moved through the project as a user, step into the shoes of the product owner and go through the same process.&lt;/p&gt;

&lt;p&gt;Your next challenge is making the feedback easy to understand when consolidated. Remember --- your client might not have any understanding of UX or design and it is your job as a UX reviewer to make the feedback concise. Explain your thinking verbally in detail if necessary, but keep your written feedback short and to the point. It is also very important to make sure that the feedback is not seen as a list of problems or issues but rather as opportunities for improvement.&lt;/p&gt;

&lt;p&gt;Lastly, do not go into solution mode yet. At this point you are only identifying usability problems. I like to consolidate my feedback into buckets:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. User journeys
&lt;/h4&gt;

&lt;p&gt;This should cover any problems relating to a user's journey. If you have trouble convincing your stakeholder of these problems, try placing them in the user's shoes. Some examples of user journey flaws could include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Information needed by a user is too low down a page&lt;/li&gt;
&lt;li&gt;  Important pages are hidden too deeply within the information architecture&lt;/li&gt;
&lt;li&gt;  Information is unnecessary and does not provide value to a user&lt;/li&gt;
&lt;li&gt;  Too many clicks are required to make a purchase&lt;/li&gt;
&lt;li&gt;  Inconsistent user journeys&lt;/li&gt;
&lt;li&gt;  Important information sits below the fold&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. General
&lt;/h4&gt;

&lt;p&gt;What are the consistent problems across the product or service? List anything that is not specific to a journey or device.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Design
&lt;/h4&gt;

&lt;p&gt;Having a design background is very useful in this section of the review, but is not necessarily a requirement. There are some aspects of design that are generally obvious to spot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Design inconsistencies (i.e buttons are different sizes on different pages)&lt;/li&gt;
&lt;li&gt;  Problems with alignment&lt;/li&gt;
&lt;li&gt;  Poor page hierarchy&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4. Mobile
&lt;/h4&gt;

&lt;p&gt;The accuracy of your mobile review is very dependent on the different types of devices you use to test (both tablet and smart phones). These issues could include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Responsive problems (i.e not mobile friendly)&lt;/li&gt;
&lt;li&gt;  Scale problems such as fonts being too small&lt;/li&gt;
&lt;li&gt;  Pinch or zoom is required on some pages&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  5. Desktop
&lt;/h4&gt;

&lt;p&gt;For the most part you would have covered any issues on desktop in the other sections, but from time to time there might be issues that are desktop specific. Also keep your analytics in mind --- if your traffic is primarily mobile you might want to skip over this section.&lt;/p&gt;




&lt;h3&gt;
  
  
  Accessibility review
&lt;/h3&gt;

&lt;p&gt;Accessibility is often overlooked by both developers and designers --- I am guilty of this myself. It has however become increasingly important to consider disabled users as we become driven by digital. Something as simple as green text on a red button could completely ruin a colour-blind user's experience and result in a lost sale or lead.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa6r19udo81o2l5qsy89h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa6r19udo81o2l5qsy89h.png" width="800" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Accessibility covers several aspects including colour, font size, font types, descriptive text or alt tags. It is important to consider all these design and technical aspects as they might affect the user's experience.&lt;/p&gt;

&lt;p&gt;A tool I often use for testing accessibility on the web is &lt;a href="https://developers.google.com/web/tools/lighthouse/" rel="noopener noreferrer"&gt;Google Lighthouse&lt;/a&gt;. Lighthouse is available via Chrome developer tools and offers detailed feedback on the speed, progressive web app features, accessibility, best practices and SEO of a website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9na86ctoqoxglr8ekgi5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9na86ctoqoxglr8ekgi5.png" width="800" height="151"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Google Lighthouse results
&lt;/h6&gt;

&lt;p&gt;Not only does it offer solutions, but also substantiates suggested changes making it a powerful tool in a UX reviewer's arsenal.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When a button doesn't have an accessible name, screen readers announce it as "button", making it unusable for users who rely on screen readers.&lt;/p&gt;

&lt;p&gt;Example of Google Lighthouse feedback&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://eightshapes.com/design-systems.html" rel="noopener noreferrer"&gt;Eightshape's&lt;/a&gt; &lt;a href="http://contrast-grid.eightshapes.com/" rel="noopener noreferrer"&gt;colour contrast grid&lt;/a&gt; is a useful tool for analysing the accessibility of a digital colour palette while &lt;a href="http://colorsafe.co/" rel="noopener noreferrer"&gt;Colorsafe&lt;/a&gt; offers an easy way to find passable colour combinations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frz40d4tgjkxte3iy2at9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frz40d4tgjkxte3iy2at9.png" width="800" height="776"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h6&gt;
  
  
  Results of Eightshapes' color contrast test
&lt;/h6&gt;




&lt;h3&gt;
  
  
  Technical review
&lt;/h3&gt;

&lt;p&gt;Whether or not you include the technical review in your presentation depends on the way you position it as well as how technical your audience is.&lt;/p&gt;

&lt;p&gt;What makes the technical review helpful is that more often than not small code changes can make a big difference in conversion rates and overall user experience.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Performance / speed
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fffrwtnywp2u6anag8ru9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fffrwtnywp2u6anag8ru9.png" width="395" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A score from Google Page Speed Insights&lt;/p&gt;

&lt;p&gt;A great tool for analyzing website speed is Google's better-known &lt;a href="https://developers.google.com/speed/pagespeed/insights/" rel="noopener noreferrer"&gt;Page Speed Insights&lt;/a&gt;. PSI offers some quick tips for improving your page speed which includes caching of assets, optimizing images and more for both desktop and mobile. The suggestions can at times become a bit technical, but Google offers links to helpful articles that explains each suggestion in detail.&lt;/p&gt;

&lt;p&gt;Performance can also be analysed using Google Lighthouse (mentioned earlier). Lighthouse provides a lot more detail than PSI and also makes suggestions based on newer technologies (like the &lt;a href="https://developers.google.com/web/fundamentals/performance/http2/" rel="noopener noreferrer"&gt;HTTP/2 standard&lt;/a&gt;).&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Best practices
&lt;/h4&gt;

&lt;p&gt;Best practices deal with whether or not a project is following standards for a given device or medium. A good example of this is when print standards creep into the web, such as forcing line breaks in headlines, which is bad practice for responsive web projects.&lt;/p&gt;

&lt;p&gt;Lighthouse is also a good tool for best practice suggestions; but knowing what is considered best practice often comes down to your experience with the channel or device you are reviewing.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. SEO
&lt;/h4&gt;

&lt;p&gt;SEO is not often considered when looking at the user experience of a web product--- but it should be. SEO deals not only with your rank, but also your search appearance. If your page does not have an enticing title and description you lose every opportunity to bring that user into your website. Often some of the problems you solve for when it comes to accessibility will impact your SEO as well (such as making alt tags more descriptive).&lt;/p&gt;

&lt;p&gt;Lighthouse provides some high level feedback on SEO, but for a more detailed view I would recommend Moz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://moz.com/" rel="noopener noreferrer"&gt;SEO Software, Tools &amp;amp; Resources for Smarter Marketing\&lt;br&gt;
Backed by the largest community of SEOs on the planet, Moz builds tools that make SEO, inbound marketing, link...moz.com&lt;/a&gt;&lt;a href="https://moz.com/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Opportunities
&lt;/h3&gt;

&lt;p&gt;The next step is to look at how you or your client can close some of the gaps in their user's experience using the wealth of data gathered from the review. These suggestions could be based on feedback from your review or opportunities you identified while using the product, for example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Adding related articles to existing pages will allow a user to continue his journey through the website once they finish reading an article&lt;/li&gt;
&lt;li&gt;  Reducing the length of the form could improve its usability which might lead to additional leads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Be careful of making swooping statements like &lt;em&gt;"Adding a banner area &lt;/em&gt;&lt;em&gt;will increase traffic&lt;/em&gt;*". *An opportunity should imply the possibility of improvement and not a promise thereof.&lt;/p&gt;




&lt;h3&gt;
  
  
  Metrics
&lt;/h3&gt;

&lt;p&gt;Implementing a solution to an identified UX problem might not be enough --- you also need to be able to measure its success. This can be done by setting metrics for specific action points.&lt;/p&gt;

&lt;p&gt;A good metric needs to be tangible and achievable. "Increase sales" for example is not a tangible metric. How would you accurately measure that and more importantly correlate it to a UX change?&lt;/p&gt;

&lt;p&gt;Break your metrics down, give them a deadline and bring them back to your objectives and identified opportunities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Decrease the bounce rate of X page by 5% &lt;em&gt;by adding related articles&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;  Capture 5 more leads on X page per day &lt;em&gt;by making the form easier to use&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your client might also want to set their own metrics. In these cases make sure that their expectations are reasonable and achievable.&lt;/p&gt;




&lt;h3&gt;
  
  
  Next steps
&lt;/h3&gt;

&lt;p&gt;Discuss next steps with your client even if you might not be responsible for implementation. Without actionable points the review is bound to become a coffee-stained desk-drop. Creating a list of actions or tasks along with their priority and metrics is a good starting point and will provide your stakeholder with enough guidance to start implementation on their own.&lt;/p&gt;

&lt;p&gt;Who knows, you might even become that implementation partner or a UX designer within their team.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhbdzziujmqlsgfe1lcd5.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhbdzziujmqlsgfe1lcd5.jpeg" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I hope you found this framework useful --- would love to know more about your experiences in the comments below. Thanks for reading.&lt;/p&gt;

&lt;p&gt;Originally posted on &lt;a href="https://medium.com/@vernonjoyce/a-ux-review-framework-anyone-can-use-4218d4821d6c" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>seo</category>
      <category>ux</category>
    </item>
    <item>
      <title>Integrating WordPress into DialogueFlow with Node JS</title>
      <dc:creator>Vernon Joyce</dc:creator>
      <pubDate>Fri, 29 Dec 2017 18:58:47 +0000</pubDate>
      <link>https://dev.to/assaultoustudios/integrating-wordpress-into-dialogueflow-with-node-js-594o</link>
      <guid>https://dev.to/assaultoustudios/integrating-wordpress-into-dialogueflow-with-node-js-594o</guid>
      <description>&lt;p&gt;The WordPress API has opened many doors for developers – particularly when it comes to managing content for other web applications and mobile apps. In this instance, we’ll be looking at how we can integrate the WordPress API into Dialogflow with Node JS to deliver content to Facebook messenger. This tutorial explains some basic concepts, but working knowledge of Node and Dialogflow will be beneficial. &lt;strong&gt;PS I've written this for intermediate devs, as an intermediate dev, feel free to skip over some of the easy concepts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before you get started, ensure that you have done the following (links are available):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installed a working version of &lt;a href="https://nodejs.org/en/download/" rel="noopener noreferrer"&gt;Node JS&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Installed the &lt;a href="https://devcenter.heroku.com/articles/heroku-cli" rel="noopener noreferrer"&gt;Heroku CLI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Created a new &lt;a href="https://blog.risingstack.com/node-hero-tutorial-getting-started-with-node-js/" rel="noopener noreferrer"&gt;Node project&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Created an empty &lt;a href="http://github.com/" rel="noopener noreferrer"&gt;GIT repository&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Set up a &lt;a href="https://console.dialogflow.com/api-client/" rel="noopener noreferrer"&gt;Dialogflow&lt;/a&gt; account&lt;/li&gt;
&lt;li&gt;Installed &lt;a href="https://www.getpostman.com/" rel="noopener noreferrer"&gt;Postman&lt;/a&gt; or &lt;a href="https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc?hl=en" rel="noopener noreferrer"&gt;JSONview for Chrome&lt;/a&gt; (recommended)&lt;/li&gt;
&lt;li&gt;Have access to a WordPress blog to pull content from (I am using &lt;a href="http://diginauts.co.za/" rel="noopener noreferrer"&gt;this blog&lt;/a&gt; as an example)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting up the intent
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Set up our tags as entities
&lt;/h3&gt;

&lt;p&gt;In order for our chatbot to understand what type of content our users are looking for, we need Dialogflow to use its natural language capabilities to understand the tags within a user’s intent. To do this, we will set up an &lt;a href="https://dialogflow.com/docs/entities" rel="noopener noreferrer"&gt;entity&lt;/a&gt;. Entities are types of content within a message that allows our bot to have more context; for example a place or a date. We need to create our tags as entities as we will later be using them to pull specific content from our WordPress blog.&lt;/p&gt;

&lt;p&gt;Start by clicking on the &lt;em&gt;Entities&lt;/em&gt; tab to the left of the Dialogflow console. Ensure that your entity has a semantic name (like &lt;em&gt;tags&lt;/em&gt;) and tick the &lt;em&gt;Define synonyms&lt;/em&gt; box. Add each tag as a new row: in the first column, add the tag number (or ID) and in the second column list all of the different synonyms for this tag. The tag number will make it easier for us to pull posts by tag from our webhook – you can get this by editing the tag in WordPress, or calling the API URL to get all tags. Once you’re done click &lt;em&gt;Save&lt;/em&gt; and head over to the &lt;em&gt;Intents&lt;/em&gt; tab.&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%2Fdghsas2f5emh0goa1gkk.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%2Fdghsas2f5emh0goa1gkk.png" alt="Dialogflow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Create an intent for content delivery
&lt;/h3&gt;

&lt;p&gt;We’ll now set up an &lt;a href="https://dialogflow.com/docs/intents" rel="noopener noreferrer"&gt;Intent&lt;/a&gt; to enable us deliver content to our users. A good strategy is to name your intent something similar to what the user might ask – this is especially useful when you have more than 10 intents. Next we add an example of a user’s input. In this case, we are using &lt;em&gt;I want to read more about development.&lt;/em&gt; In order for Dialogflow to understand &lt;em&gt;development&lt;/em&gt; within context of the user’s message, we need to map the word to our entity. Select the entire word and the entity menu should automatically open up – scroll down or use the filter to select the tag (@tag) entity that we created.&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%2Fko9wmz6w8mwv4ezuuf4b.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%2Fko9wmz6w8mwv4ezuuf4b.png" alt="Dialogflow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Training our bot
&lt;/h3&gt;

&lt;p&gt;If we now send a &lt;em&gt;I want to read more about development&lt;/em&gt; as a test message within the right-hand message console, you will notice that Dialogflow returns an empty message, with a set &lt;em&gt;Paramater&lt;/em&gt; of &lt;em&gt;Tags&lt;/em&gt; and a &lt;em&gt;value&lt;/em&gt; of &lt;em&gt;22&lt;/em&gt; (which is the ID for the &lt;em&gt;development&lt;/em&gt; tag). If we change our message to &lt;em&gt;I want to read more about content&lt;/em&gt;; we get a similar response but the value of our tag parameter will be content. This means that Dialogflow is able to understand our message and discern that we want to know specifically about development or content.&lt;/p&gt;

&lt;p&gt;If we however change our message to &lt;em&gt;I want to know more about web design,&lt;/em&gt; Dialogflow will in most cases not be able to understand which tag we are referring to. This is because our bot needs some additional training – which means we need to add more possible user messages. These could include &lt;em&gt;I want to know more about, tell me more about, I’d like to read about, can you help me with.&lt;/em&gt; There’s no limit to the amount of scenarios you can add to Dialogflow; but 10 usually does the trick. As you add these messages you might find Dialogflow picking up the entities automatically, which just means that your training is working.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting an action and making tag a required entity
&lt;/h3&gt;

&lt;p&gt;One of the requirements for webhooks is having something to identify our intent by. This can be done in many ways, but my recommendation is to use the action property of an intent. Dialogflow will take the entire intent’s payload (a JSON object) and send this to our webhook. We can then access the payload and check the value of the action key and ultimately use this to build our logic. I’ll show you how this works later, but in the meantime, just give your intent an action by entering it into the action input field. Call it something semantic – in my case I am using &lt;em&gt;get.wp.content.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Next we need to ensure that our bot always has some context when it sends off that payload to our bot. If you were to ask your bot something like &lt;em&gt;I want to know more&lt;/em&gt; you will notice that it is unable to pick up our &lt;em&gt;Tag&lt;/em&gt; entity – because our message doesn’t contain one. To fix this problem we need to set our tag entity to &lt;em&gt;required&lt;/em&gt; by ticking this box underneath the action input field. We also need to give our bot a way to ask for this information, and this can be done by selecting the prompts column and adding a prompt for more information. Good examples include &lt;em&gt;What do you need help with?&lt;/em&gt; or &lt;em&gt;What is your profession?&lt;/em&gt;&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%2Fuj8g65tqpujgist37nrw.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%2Fuj8g65tqpujgist37nrw.png" alt="Dialogflow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once done, save your intent and we should now be ready to move on to building our webhook and integrating it into a WordPress blog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a webhook
&lt;/h2&gt;

&lt;p&gt;There are plenty of repositories available online for pre-built webhooks; but for the purpose of this article we will be building one from scratch. I will provide code samples, but this is not necessarily a Node tutorial, so if you have any questions leave a comment. You are also welcome to fork the repo for this project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up our project
&lt;/h3&gt;

&lt;p&gt;For our webhook, we will be using the &lt;a href="https://www.npmjs.com/package/express" rel="noopener noreferrer"&gt;express&lt;/a&gt;, &lt;a href="https://www.npmjs.com/package/body-parser" rel="noopener noreferrer"&gt;body-parser&lt;/a&gt; and &lt;a href="https://www.npmjs.com/package/request" rel="noopener noreferrer"&gt;request&lt;/a&gt; packages. To get started, we will install these packages via npm install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install express body-parser request

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you have these packages installed, you can set up the rest of your project by organizing assets. I will be saving all of my code (except server.js) in a lib folder; this will help us segment our functionality to make our code more readable and reusable. Lastly don’t forget to &lt;a href="https://chaseadams.io/2015/07/my-gitignore-conventions/" rel="noopener noreferrer"&gt;add node_modules to .gitignore&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;To get started, create a new file in your project root called server.js. This will house all our express code and will be our default script. Open up server.js and start off by importing the express and body-parser modules – we will be using &lt;a href="http://es6-features.org/" rel="noopener noreferrer"&gt;ES6&lt;/a&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="c1"&gt;// Modules&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&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;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bodyParser&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;body-parser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next we declare app as a new express instance, and add body-parser to it as a &lt;a href="http://expressjs.com/en/guide/using-middleware.html" rel="noopener noreferrer"&gt;middleware&lt;/a&gt; to enable us to read our JSON payload from Dialogflow.&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="c1"&gt;// Express set up&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bodyParser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the express app is set up, we need to start our own server. Express requires us to set a port number in order to start a server; but because Heroku assigns ports at server runtime; we will need to get the port number from the Heroku environment. To achieve this, we use process.env.PORT with a default to 3100 should no environmental port exist. You can read more about this &lt;a href="https://www.twilio.com/blog/2017/08/working-with-environment-variables-in-node-js.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Your code should now look like this:&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="c1"&gt;// Modules&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&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;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bodyParser&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;body-parser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Set port for server&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;3100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Express set up&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bodyParser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="c1"&gt;// Start server&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Listening on port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it for now – we have everything we need to start writing our webhook.&lt;/p&gt;

&lt;h3&gt;
  
  
  Writing our webhook route
&lt;/h3&gt;

&lt;p&gt;Dialogflow requires a route in order to successfully communicate with our webhook. We will be creating a new post &lt;a href="http://expressjs.com/en/guide/routing.html" rel="noopener noreferrer"&gt;express route&lt;/a&gt; to handle this. I am naming this route &lt;em&gt;/webhook&lt;/em&gt; to make our code more scalable, should we want to add more routes later. In the lines following the loading of the body parser middleware, create a new post route:&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/webhook&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside our webhook route, let’s get the action from our Dialogflow payload. If you are unsure of how the payload is structured, you can view the JSON structure within Dialogflow when sending a test message on the right-hand side of the console. In our JSON object, the action is within the result object of our payload. We need to access this by getting the body of our request object – the request object is any information sent via post to our webhook route. Our body parser middleware will allow us to get the body from the request object, which we’ll store in a new variable called action. Let’s also declare another empty variable called message (which will be the message our webhook sends back to Dialogflow).&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;let&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last step is to send a response back to Dialogflow by using our routes response object – this is done by calling res.send. We will be sending back a JSON object containing our message, which forms part of Dialogflow’s &lt;a href="https://dialogflow.com/docs/fulfillment" rel="noopener noreferrer"&gt;fulfillment lifecycle&lt;/a&gt;. We will also use a simple if/else ternary to check whether or not we are hitting the &lt;em&gt;get.wp.content&lt;/em&gt; action we set up in Dialogflow. Our server.js file should then look something like this:&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;express&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;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bodyParser&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;body-parser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;3100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bodyParser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/webhook&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;get.wp.content&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`Hey, our webhook is connected!`&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Sorry, I didn't get that`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;speech&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;displayText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;wp-webhook&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Listening on port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Connecting our webhook
&lt;/h3&gt;

&lt;p&gt;Now that our base webhook is done, it needs to be uploaded to &lt;a href="https://www.heroku.com/" rel="noopener noreferrer"&gt;Heroku&lt;/a&gt;. Heroku offers free hosting for Node (and many more) applications, with the option to scale when necessary which makes it a great option for deploying our webhook. Dialogflow requires webhooks to be hosted on https, which Heroku takes care of too.&lt;/p&gt;

&lt;p&gt;First off, let’s &lt;em&gt;cd&lt;/em&gt; into your project folder and create a new Heroku app by running &lt;em&gt;heroku create&lt;/em&gt; within terminal or command prompt. If you are asked to log in, use your Heroku credentials and retry the command. Once created, you will be presented with a unique Heroku url which is the link we’ll be using later within Dialogflow. Next we add all our files to our git repo, and commit them. The last step is to push these files up to our Heroku app by running git push heroku master.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;heroku create
git add .
git commit -m "Init webhook"
git push heroku master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you push up your code, it will run all the necessary build steps and once done you should see &lt;em&gt;Build succeeded!&lt;/em&gt; within the console. You can now test your application by running heroku open, which will open your heroku app. You should see an error message; &lt;em&gt;Cannot get /;&lt;/em&gt; this is normal as we haven’t set up this route.&lt;/p&gt;

&lt;p&gt;Now that our webhook is working, we need to enable fulfillment within Dialogflow. To do this, click on the fulfillment tab in the left-hand menu, and on this page enable it. Paste your webhook url (you have to include /webhook) into the first input and save.&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%2Fowv0b4icmg45rqi4g644.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%2Fowv0b4icmg45rqi4g644.png" alt="Dialogflow"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The final step is to go into our intent on Dialogflow and enable &lt;em&gt;Use webhook&lt;/em&gt; under the fulfillment section of the page (right at the bottom). Click save and wait for the agent to train. Now when you send &lt;em&gt;I want to read more about development&lt;/em&gt; to the testing console on the right-hand side, you should get &lt;em&gt;Hey, our webhook is connected!&lt;/em&gt; as a response!&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting WordPress articles
&lt;/h2&gt;

&lt;p&gt;For this next part, I’d recommend you use something like Postman to have a better understanding of responses from the WordPress API look like. If you don’t have your own blog to pull content from, you can use Diginauts (as per this demo) as it gets a low amount of traffic. To do some testing, hit &lt;a href="http://yoursite.com/wp-json/wp/v2/posts" rel="noopener noreferrer"&gt;http://yoursite.coma/wp-json/wp/v2/posts&lt;/a&gt; in Postman (or a browser) and you should see a JSON object with a list of posts from that blog. This is how all of our posts will be structured and we will later use this information to format our Facebook messenger response.&lt;/p&gt;

&lt;p&gt;We can also get posts with specific tags, if you hit &lt;a href="http://yoursite.com/wp-json/wp/v2/posts?tags=22" rel="noopener noreferrer"&gt;http://yoursite.com/wp-json/wp/v2/posts?tags=22&lt;/a&gt; you’ll see only posts tagged with the &lt;em&gt;development&lt;/em&gt; tag. This is great news as it means we can now use our Dialogflow tag parameter to get the posts we need.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up the API request
&lt;/h3&gt;

&lt;p&gt;Back in our project, I’m going to create a new folder called &lt;em&gt;wordpress&lt;/em&gt; in our &lt;em&gt;lib&lt;/em&gt; folder, and create a new file called &lt;em&gt;wordpress.js&lt;/em&gt;. The first thing we need is to load the &lt;em&gt;request&lt;/em&gt; module we installed earlier, as we will be making an API request. I am also going to declare a new variable with a link to the API.&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;request&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;request&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://yourblog.com/wp-json/wp/v2/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We now want to set up a function that will allow us to load posts from the WordPress API. Our function will take two arguments, the tag we want to fetch content for as well as a callback for when our API call is completed.&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;let&lt;/span&gt; &lt;span class="nx"&gt;getPosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we want to construct the URL for our API call. There are various ways to do this, and ideally you want to refactor the getPosts function by adding more logic to our API URL, but for now we’ll keep it simple. Our API call has three requirements: we will firstly be hitting the /post route of the WordPress API which will allow us to get posts. Secondly, we need add a URL parameter to only get posts of a particular tag by its ID. Lastly, we want to add the _embed parameter as this will include the featured image in our payload. I will embed all of these using &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals" rel="noopener noreferrer"&gt;ES6 template strings&lt;/a&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;let&lt;/span&gt; &lt;span class="nx"&gt;getPosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/posts?tags=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;_embed`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Handling the error and not found cases
&lt;/h3&gt;

&lt;p&gt;We are now ready to fire a request to the WordPress API using the &lt;em&gt;request&lt;/em&gt; module. Request takes two arguments: our API URL (or an object with data) and a callback function with an error, response and body argument. Within an I’d statement we will handle the error and success case. For now, let’s call our callback if an error occurs by adding a user-friendly error message and returning the error.&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;let&lt;/span&gt; &lt;span class="nx"&gt;getPosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/posts?tags=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;_embed`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sorry, there was an error getting posts from our blog&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For our not found and success cases, we need to firstly &lt;a href="https://www.w3schools.com/js/js_json_parse.asp" rel="noopener noreferrer"&gt;parse&lt;/a&gt; our response’s body as the WordPress API will return an array of stringified JSON objects and assign this to a variable. Once we’ve parsed the response we need to check the amount of items in our array – if the array is empty no articles were returned so we can let our users know via a friendly message.&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;let&lt;/span&gt; &lt;span class="nx"&gt;getPosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/posts?tags=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;_embed`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sorry, there was an error getting posts from our blog&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
                &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`It doesn't seem like there's any content available on this topic`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Handling the success case
&lt;/h3&gt;

&lt;p&gt;Add an else statement to our check for the array length to deal with the success case. The WordPress API returns a lot of data that we won’t be needing for our Facebook cards, so we need to map the data into a new array and take only the information we need. At the same time, it would be beneficial to structure our array in the &lt;a href="https://developers.facebook.com/docs/messenger-platform/send-messages/template/generic" rel="noopener noreferrer"&gt;format required by Facebook&lt;/a&gt; to show cards within messenger. Most of the information we need can be found by traversing our API response (you can use Postman for a better view of what this response looks like). For the subtitle we need to strip out all HTML tags and entities to ensure we send a clean string to Facebook as the API does not return a clean string – we can do this with regex. Lastly, we need to get our featured image. This is embedded very deep into our API response and you have to use bracket notation when referencing &lt;em&gt;wp:featuremedia&lt;/em&gt; as it contains a colon.&lt;/p&gt;

&lt;p&gt;The last thing we need to do for our success case is add a text message to our bot’s response as it would be odd if our users only got a list of articles. We can do this by adding a custom message at the beginning of our formattedPosts array using unshift. Once this is done, we can call our callback by setting our first argument as undefined (as there was no error) and setting our second argument equal to formattedPosts. Export getPosts via module.exports and we’re done with our wordpress module.&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;request&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;request&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://diginauts.co.za/wp-json/wp/v2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;getPosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/posts?tags=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;_embed`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sorry, there was an error getting posts from our blog&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`It doesn't seem like there's any content available on this topic`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;formattedPosts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="na"&gt;type&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;span class="na"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;facebook&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rendered&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="na"&gt;subtitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;excerpt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rendered&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="se"&gt;(?:&lt;/span&gt;&lt;span class="sr"&gt;.|&lt;/span&gt;&lt;span class="se"&gt;\n)&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;?&lt;/span&gt;&lt;span class="sr"&gt;&amp;gt;/gm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&amp;amp;&lt;/span&gt;&lt;span class="se"&gt;[^\s]&lt;/span&gt;&lt;span class="sr"&gt;*/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                        &lt;span class="na"&gt;imageUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_embedded&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;wp:featuredmedia&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;media_details&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sizes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;listing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;source_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="na"&gt;buttons&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                            &lt;span class="p"&gt;{&lt;/span&gt;
                                &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Read more&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                &lt;span class="na"&gt;postback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;
                            &lt;span class="p"&gt;}&lt;/span&gt;
                        &lt;span class="p"&gt;]&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;});&lt;/span&gt;

                &lt;span class="nx"&gt;formattedPosts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unshift&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="na"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;facebook&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="na"&gt;speech&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sure, here are some helpful articles&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
                &lt;span class="p"&gt;});&lt;/span&gt;

                &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;formattedPosts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;getPosts&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tying it all together
&lt;/h2&gt;

&lt;p&gt;Since our post data is ready to be consumed, we can go ahead and send a response back to Dialogflow from &lt;em&gt;server.js&lt;/em&gt;. First, let’s import our wordpress.js module using require and remove our message variable as well as the existing code for sending a response. Create a new variable for the tag we will be passing to our getPosts function and set this equal to the parameters property of our Dialogflow payload.&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;express&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;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bodyParser&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;body-parser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wordpress&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;./lib/wordpress/wordpress&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;3100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bodyParser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/webhook&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Listening on port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are now able to call our getPosts function via the wordpress module we imported. This function will take our tag as an argument followed by our callback function. Our callback function has its own parameters: an error message and our post content. If there is an error message present, we can send that error message as a Dialogflow response to the user by using the same JSON format we used earlier. For our success case (i.e errorMessage is undefined) we can send our post content to Dialogflow, but this time we will be sending it via the &lt;em&gt;message&lt;/em&gt; property. The &lt;em&gt;message&lt;/em&gt; property contains an array of messages for different platforms and types and since we specified this array in wordpress.js, we can simply send off our &lt;em&gt;postContent&lt;/em&gt; variable. Leave speech and displayText empty as we won’t be needing a generic response.&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;express&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;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bodyParser&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;body-parser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wordpress&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;./lib/wordpress/wordpress&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;3100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bodyParser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/webhook&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;wordpress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getPosts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;errorMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;postContent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;errorMessage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="na"&gt;speech&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;errorMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;displayText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;errorMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;wp-webhook&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="na"&gt;speech&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;displayText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;wp-webhook&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;postContent&lt;/span&gt;
            &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Listening on port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Push this code up to Heroku and test your intent within the Dialogflow console. You can switch the response type to Facebook messenger to test that the cards are pulling through properly. If you are happy with the results, &lt;a href="https://dialogflow.com/docs/integrations/facebook" rel="noopener noreferrer"&gt;connect Dialogflow to Facebook messenger&lt;/a&gt; via the _Integrations _tab and you’re ready to go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It would be potentially beneficial to refactor our code and create a function for creating Facebook cards. Currently our getPost function is quite messy, and it would be better to separate those concerns&lt;/li&gt;
&lt;li&gt;Sometimes people might provide multiple tags – Dialogflow has the ability to interpret entities in a list. Our code would need to be modified considerably but it should be do-able.&lt;/li&gt;
&lt;li&gt;Remember to train your bot often – there is nothing worse than hitting a dead-end when chatting to a bot!&lt;/li&gt;
&lt;li&gt;Integration into Chatbase is a must, especially if you are delivering large amounts of content via chat channels&lt;/li&gt;
&lt;li&gt;Consider other chat channels – Slack is a good one and also offers cards&lt;/li&gt;
&lt;li&gt;Enable caching so bot responses are faster.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>chatbots</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>node</category>
    </item>
    <item>
      <title>What to learn next as a front-end developer</title>
      <dc:creator>Vernon Joyce</dc:creator>
      <pubDate>Mon, 16 Oct 2017 15:20:36 +0000</pubDate>
      <link>https://dev.to/assaultoustudios/what-to-learn-next-as-a-front-end-developer-957</link>
      <guid>https://dev.to/assaultoustudios/what-to-learn-next-as-a-front-end-developer-957</guid>
      <description>

&lt;p&gt;As a frontend developer, it’s easy to get overwhelmed with the dizzying number of frameworks and libraries available. We work towards improving our skills, but knowing what to learn next is difficult; especially when you are just starting out. This article will help you make an informed decision about what to learn next as a front-end developer.&lt;/p&gt;

&lt;p&gt;The great thing about development is that it’s always evolving, which gives developers a variety of study and career opportunities. An important thing to remember is that there is no right or wrong framework, library or language. Some front-end developers might recommend specific tools, but the framework or language you choose to work with should be one you love. You should choose something you enjoy, which compliments your workflow and which ultimately could land you your dream job.&lt;/p&gt;

&lt;p&gt;Clients generally aren’t interested in how it’s built, as long as it works. You don’t buy a pair of jeans and think about how they were woven, you just wear them. There are however some exceptions to this rule. Working in a tech hub, your clients or employers might require you to use very specific frameworks.&lt;/p&gt;

&lt;p&gt;With this in mind, let’s look at some tips and tricks on how you can improve skills and grow your career as a front-end dev.&lt;/p&gt;

&lt;p&gt;Start by asking yourself where you want to be in five years time. Without a sense of direction there is no way you can accurately decide on a skill to learn. The type of framework or skill very much depends on the type of career you want to lead:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. A dev-ops role:
&lt;/h3&gt;

&lt;p&gt;In this case you should be learning about both front- and back-end technologies. Get an overview of the tech involved on a server level so you have the knowledge to effectively make technical decisions. This could also translate to any team leader role, being knowledgeable allows your team to look to you for guidance. This also very much depends on where you live as each industry in each County could vary. This sort of role requires you to be very knowledgeable, so a lot of reading and experience is required to get to the required level of expertise.&lt;/p&gt;

&lt;p&gt;A big part of dev-ops also revolves around automating processes and ensuring your team has a well-rounded workflow. As a result this could be seen as a leadership roll and you will often be tasked with making difficult tech decisions.&lt;/p&gt;

&lt;p&gt;Frameworks or technologies could include: PHP, Java or .net technologies, knowledge about system architecture, SQL or MySQL, AngularJS, React, Node.js, server technologies like Apache or IIS, UX tools like Adobe XD, unit testing tools like Qunit or Mocha, knowledge about how DNS works. It all depends on what interests you, but learn as much as you can.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Full-stack developer:
&lt;/h3&gt;

&lt;p&gt;There is a lot of contention around what it means to be a full-stack developer. From experience, a full-stack developer would in his/her arsenal have: An understanding of design, a back-end language and a front-end framework (with architectural experience being beneficial).&lt;/p&gt;

&lt;p&gt;Pick a back-end language like PHP, .NET or Node.js and get really good at it - it's the perfect skill to add to your front-end arsenal. For added efficiency, learn some design or UX theory. This will enable you to roll out a project by yourself from start to finish and make informed design and tech decisions about building good products.&lt;/p&gt;

&lt;p&gt;Frameworks or technologies could include: PHP, .NET, Ruby, Java or Python for backend. For UX and UI,: Bootstrap, Adobe XD, Photoshop.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. App developer:
&lt;/h3&gt;

&lt;p&gt;This is without a doubt one of the faster growing industries in the world, whether you are building native or progressive web apps. There is a lot of opportunity in the app industry and many frameworks to choose from and this is especially true in developing countries. &lt;/p&gt;

&lt;p&gt;Frameworks or technologies could include: Ionic, AngularJS, CSS and HTML with Adobe Phonegap, Apple’s Swift.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. API developer:
&lt;/h3&gt;

&lt;p&gt;With the advent of microservices there is a growing need for really good API developers. You would be responsible for building new APIs or maintaining existing ones. APIs often plug into other microservices; so you would be required to have a good understanding of how other APIs can be utilised and plugged into.&lt;/p&gt;

&lt;p&gt;Frameworks or technologies could include: Node.js, .NET, C#, Postman&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Be better in a specific role:
&lt;/h3&gt;

&lt;p&gt;If you want to just be a better front-end developer, then make sure you know your basics very well. Simply knowing CSS and HTML isn’t always enough, you need to know it intimately. Then learn Javascript and only then move on to frameworks. Not many people are exceptionally good at doing front-end (especially when it comes to creating good user experiences with well-built user interfaces). The web isn't going anywhere soon so it's worth investing the time to become the best in your industry.&lt;/p&gt;

&lt;p&gt;Although the front-end industry is often abuzz with frameworks like AngularJS, this does not necessarily mean that they have been fully adopted in your country. Many countries with young dev industries don't use React in production, as an example. This is especially true in South Africa where many large corporations still have flat or coded HTML and CSS sites applications. This works in your advantage as it means you do not necessarily have to rush learning a new framework. There is more than enough time to get to know a framework you love really well.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Enjoy what you do
&lt;/h3&gt;

&lt;p&gt;The most important lesson we can take from this is to just enjoy yourself. If you have a passion for front-end development then you won’t have a problem learning something new. Just take your time, soak it in and remember that you don’t have to learn all the languages in existence in a single day.&lt;/p&gt;


</description>
      <category>beginners</category>
      <category>frontend</category>
      <category>career</category>
      <category>webdev</category>
    </item>
    <item>
      <title>8 tips for being a better developer</title>
      <dc:creator>Vernon Joyce</dc:creator>
      <pubDate>Fri, 13 Oct 2017 08:36:37 +0000</pubDate>
      <link>https://dev.to/assaultoustudios/8-tips-for-being-a-better-developer-je</link>
      <guid>https://dev.to/assaultoustudios/8-tips-for-being-a-better-developer-je</guid>
      <description>

&lt;p&gt;Front-end development is ever-changing, and we often find ourselves needing to change with it. Whether it’s the next big framework or language, there will always to an extent be something new to learn. But how do you go about growing your career or learning new skills? How can you be the best developer you can be? Here are 8 tips for being a better developer:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Be honest with yourself and employers
&lt;/h3&gt;

&lt;p&gt;There is an interesting movement happening in the dev industry, especially in South Africa. Many developers tend to add skills to their CV that they don’t necessarily have. Having only read an article on AngularJS does not give you the authority to add it as a skill. Remember that your employer will depend on you and will expect you to know what you are doing. Only add a skill if you are confident that you can run a project therein from start to finish, on time.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tailor your CV
&lt;/h3&gt;

&lt;p&gt;Tailor your CV for the type of work you want to do and not necessarily the type of work you think you should be doing. There are many front-end developers that know only CSS and HTML and lead very successful careers and it could potentially be a stepping stone into a better position. It’s about what you as a developer feel passionate about and where you see your career heading. If you know AngularJS but have no interest in building AngularJS projects; don’t feel ashamed to remove it from your CV. Chances are your prospective employer will take in interest in that skill and you might end up doing something completely different to what you applied for.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Pick a framework you like
&lt;/h3&gt;

&lt;p&gt;Pick a framework or language you like and spend a lot of time getting really good at it. A business’ main goal is to make money; if you work efficiently you will get rewarded. This is not to say that you should only focus on a single framework, but it helps to be exceptional in your field of interest. In a lot of countries; like South Africa; frameworks like AngularJS or React.js are still very new. They will most likely only be fully utilised in businesses in a few years’ time (this of course is not to say that there aren’t businesses already using these frameworks). This means that there is more than enough time to learn a new framework and will ensure you are ready to start working therein once it reaches its peak. Do some market research to see what there is a big need for as this could ultimately help you make the right decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Learn how to work with clients and manage projects
&lt;/h3&gt;

&lt;p&gt;A big requirement for most professionals in our industry is the ability to run a project and work with clients. Often in the development industries you might be building projects by yourself, so your employer will expect you to be self-sufficient and work closely with your clients. This also relates to our first point: you can’t effectively run a project if you don’t understand the technology you’ll be using. Learn proper email etiquette, how to write briefs and how to manage your clients’ expectations to ensure that their goals are realistic and you will set yourself up for a promotion into a senior role.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Pay attention to detail
&lt;/h3&gt;

&lt;p&gt;Get really good at attention to detail. It’s important that you uphold a high standard of work. When you receive designs, make sure they are pixel perfect as this is what your client (and most importantly your designer) expects. Adhere to coding standards; whether it relates to code syntax, folder structures or managing code versioning with git. When moving into a senior developer role these are the skills that will separate you from a mid-weight and it will also improve your overall workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Learn some design
&lt;/h3&gt;

&lt;p&gt;Many developers start out as designers before they move into Web. Knowing how to design gives you an incredible edge over other developers in the industry as it enables you to be better at pixel perfect development and also enables you to make design decisions when it comes to prototyping. Many developers build products without considering UX and UI – this is simply because they don’t know any better. By learning a few simple design concepts you will be able to do rapid prototyping and do a lot more dev work without a designer looking over your shoulder.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Build templates
&lt;/h3&gt;

&lt;p&gt;Learn how to work with templates from some of the big CMS systems if you are interested in building brochure websites or interactive experiences. WordPress and Drupal aren’t going anywhere anytime soon and you can make a killing off of selling templates. More and more this is becoming an essential skill; knowing how to build WordPress templates not only gives you the ability to build nearly any type of dynamic website but also teaches you a lot about languages like PHP.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Freelance
&lt;/h3&gt;

&lt;p&gt;Do freelance work where and if you can. This will help you with all of the suggestions on this list by giving you a space where you can practice your skills. Doing freelance web development is rewarding and will push you into new avenues and will connect you to new people. The best part about this is that if you fail at a project it won’t cost you your job, so there is a lot of room to grow and be playful.&lt;/p&gt;

&lt;p&gt;Where to next? Now that you know about being a good developer, check out our recommendations for &lt;a href="http://diginauts.co.za/what-to-learn-next-as-a-front-end-developer/"&gt;What to learn next as a front-end developer&lt;/a&gt;.&lt;/p&gt;


</description>
      <category>frontend</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>career</category>
    </item>
  </channel>
</rss>
