<?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: Kindred</title>
    <description>The latest articles on DEV Community by Kindred (@kvyshh).</description>
    <link>https://dev.to/kvyshh</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%2F745261%2Fb5792ea5-7eac-4344-8bdb-01047c9fdf07.png</url>
      <title>DEV Community: Kindred</title>
      <link>https://dev.to/kvyshh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kvyshh"/>
    <language>en</language>
    <item>
      <title>Who stole the cookie from the cookie jar? (RoR Security)</title>
      <dc:creator>Kindred</dc:creator>
      <pubDate>Fri, 17 Dec 2021 22:15:52 +0000</pubDate>
      <link>https://dev.to/kvyshh/who-stole-the-cookie-from-the-cookie-jar-ror-security-1o6d</link>
      <guid>https://dev.to/kvyshh/who-stole-the-cookie-from-the-cookie-jar-ror-security-1o6d</guid>
      <description>&lt;p&gt;When it comes to building out our own applications for the real world, it's good to keep in mind the idea of security. Sure, when you're working on some labs and executing code for school or practice, it may not be top of mind, however, hacking, security, and encryption are a big topic when it comes to the vulnerability of applications and user data.&lt;/p&gt;

&lt;p&gt;When building out an app, our frameworks help us structure our application so we can build robust, functioning apps. Frameworks can also help us build a more secure app, but it's a good idea to know that one framework isn't more &lt;em&gt;secure&lt;/em&gt; than another. When building out secure apps with Ruby on Rails, by default, it has some great security measures built in, but purely relying on those for security is not advisable. They do, however, have some clever methods developers can use to beef up security.&lt;/p&gt;

&lt;h6&gt;
  
  
  I won't be going into huge detail about advanced methods on how to make an app more secure, but I wanted to touch on some basic security measures you can implement on your app.
&lt;/h6&gt;




&lt;h3&gt;
  
  
  Table of Contents
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;What Ruby on Rails has to Offer for Basic Security&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security HTTP Headers&lt;/li&gt;
&lt;li&gt;Security Policy Header&lt;/li&gt;
&lt;li&gt;Feature Policy&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Common Security Attacks&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Security Gems&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Practical Security Best Practices&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Session Hijacking&lt;/li&gt;
&lt;li&gt;Cross-Site Request Forgery&lt;/li&gt;
&lt;li&gt;SQL Injection&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Conclusion &amp;amp; Security Checklist &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  What Ruby on Rails has to Offer for Basic Security &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;If you didn't already know, Ruby on Rails gained an overnight upsurge in popularity thanks to Apple, but in the beginning much of it's criticism lied around security after the 2012 breaches.&lt;/p&gt;

&lt;p&gt;That being said, RoR devs since then have worked tirelessly to introduce a number of useful security updates to make sure the out-of-the-box security measures are are fool-proof as can be. Ruby on Rails now has an annual security audit  once a year that improves security of the platform as a whole, but also helps mitigate a number of other difficulties. As of today, Ruby on Rails features an inbuilt default-protection against various types of security attacks. The development environment has graduated to become one of the safest development environment available today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes the statement above true?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Thousands of people work on Ruby on Rails every day&lt;/li&gt;
&lt;li&gt;Hundreds of people try to breach Ruby on Rails every day&lt;/li&gt;
&lt;li&gt;Maintainers implement a strict security policy

&lt;ul&gt;
&lt;li&gt;Reported vulnerability is discussed via private channels&lt;/li&gt;
&lt;li&gt;If confirmed, all the code is checked for similar vulnerabilities&lt;/li&gt;
&lt;li&gt;Fixes cover all the supported releases, not only the latest one&lt;/li&gt;
&lt;li&gt;Interested parties get notified along with the launch&lt;/li&gt;
&lt;li&gt;They wait an additional 6 hours before the announcement&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;The best way to receive all the security announcements is to subscribe to the &lt;a href="https://groups.google.com/g/rubyonrails-security?pli=1" rel="noopener noreferrer"&gt;Rails Security mailing list&lt;/a&gt;. The mailing list is very low traffic, and it receives the public notifications the moment the embargo is lifted.&lt;/p&gt;
&lt;h6&gt;
  
  
  -&lt;em&gt;Ruby on Rails "Security Policy"&lt;/em&gt;
&lt;/h6&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Ruby on Rails Security HTTP Headers &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;So if you didn't already know, HTTP security headers, are a subset of HTTP headers which are exchanged between the web client  (usually a browser) and a server. The security headers in particular specify the security related details of the HTTP communication. (If you don't understand the relationship between HTTP headers and the server, I would start with "How the Internet Works" before thinking about security.) &lt;/p&gt;

&lt;p&gt;By default, RoR equips each request with a set of headers. These settings belong to the underlying &lt;code&gt;ActionDispatch&lt;/code&gt; module, a huge part of Rails core, and responsible for routing requests to controllers.&lt;br&gt;
&lt;em&gt;lib/action_dispatch/railtie.rb&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;action_dispatch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;default_headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"X-Frame-Options"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"SAMEORIGIN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"X-XSS-Protection"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"1; mode=block"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"X-Content-Type-Options"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"nosniff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"X-Download-Options"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"noopen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"X-Permitted-Cross-Domain-Policies"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"none"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"Referrer-Policy"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"strict-origin-when-cross-origin"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are the provided default settings to ensure some security, and in most cases it doesn't need tampering with. &lt;/p&gt;

&lt;p&gt;If you do need to change them, you can generally do that in these places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;config/application.rb&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Dedicated environment configuration files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's quickly look at what each of these mean so you can understand what security measures RoR is implementing by default.&lt;/p&gt;

&lt;h4&gt;
  
  
  Security Header: X-Fram-Options
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="s2"&gt;"X-Frame-Options"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"SAMEORIGIN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;X-Frame-Options&lt;/code&gt; header with a &lt;em&gt;secure&lt;/em&gt; &lt;code&gt;SAMEORGIN&lt;/code&gt; value tells the browser that it should only open URL addresses linking to the same domain in the &lt;code&gt;&amp;lt;iframe /&amp;gt;&lt;/code&gt; tags.&lt;/p&gt;

&lt;p&gt;This is great for security, but it does not allow for parts of your app to be available in an iframe on a different domain.&lt;/p&gt;

&lt;p&gt;You can override the value of X-Frame-Options globally using the config.action_dispatch.default_headers setting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;action_dispatch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;default_headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'X-Frame-Options'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ALLOW-FROM https://apps.facebook.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Please look at additional documentation on how to change your x-frame-options for a specific controller or your whole app, as well as additional security you'll have to edit.&lt;/p&gt;

&lt;h4&gt;
  
  
  Security Header: X-XSS-Protection
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="s2"&gt;"X-XSS-Protection"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"1; mode=block"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;X-XSS-Protection&lt;/code&gt; with value &lt;code&gt;1;mode=block&lt;/code&gt; enables the built-in Cross-Site Scripting (a type of attack) filter. &lt;/p&gt;

&lt;p&gt;The first part, 1, simply turns the option on.&lt;/p&gt;

&lt;p&gt;The second part, mode=block, prevents browsers from rendering pages if a potential XSS reflection attack is detected. &lt;/p&gt;

&lt;p&gt;We'll discuss the basis of some Cross-Site Request Forgery later in this blog.&lt;/p&gt;

&lt;h4&gt;
  
  
  Security Header: X-Content-Type-Options
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="s2"&gt;"X-Content-Type-Options"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"nosniff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;X-Content-Type-Options&lt;/code&gt; with value &lt;code&gt;nosniff&lt;/code&gt; is responsible for blocking a request if its destination is of either &lt;code&gt;style&lt;/code&gt; or &lt;code&gt;script&lt;/code&gt; types and their MIME types do not match. &lt;/p&gt;

&lt;p&gt;MIME stands for "multipurpose internet mail extension" is an internet standard that describes the contents of internet files based on natures and formats. MIME types contain two parts: a type and sub-type. &lt;br&gt;
Example MIME types:&lt;br&gt;
&lt;code&gt;text/html&lt;/code&gt;&lt;br&gt;
&lt;code&gt;application/json&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Security Header: X-Download-Options
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="s2"&gt;"X-Download-Options"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"noopen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;X-Download-Options is a header specific to Internet Explorer 8. Its functionality is to block the browser from executing the downloaded HTML file in the context of the website.&lt;/p&gt;
&lt;h4&gt;
  
  
  Security Header: X-Permitted-Cross-Domain-Policies
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="s2"&gt;"X-Permitted-Cross-Domain-Policies"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"none"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;X-Permitted-Cross-Domain-Policies&lt;/code&gt; with value &lt;code&gt;none&lt;/code&gt; instructs clients such as AdobeAcrobat and Flash to avoid accessing any data from your domain.&lt;/p&gt;
&lt;h4&gt;
  
  
  Security Header: Referrer-Policy
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="s2"&gt;"Referrer-Policy"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"none"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;Referrer-Policy&lt;/code&gt; is responsible for controlling how much information should be sent in the Referrer header. This attribute is used to specify the reference information that will be sent to the server when the user clicks on a hyperlink. The &lt;code&gt;strict-origin-when-cross-origin value&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allows sending origin, path and query string for the same origin requests&lt;/li&gt;
&lt;li&gt;Allows sending only the origin performing the cross requests, as long as protocol security stays the same&lt;/li&gt;
&lt;li&gt;Does not send &lt;code&gt;referrer&lt;/code&gt; header to less-secure destinations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In addition to some of the default measures, there are a few additional security headers we can look at that could be of value!&lt;/p&gt;


&lt;h6&gt;
  
  
  Addtional Security Headers
&lt;/h6&gt;
&lt;h4&gt;
  
  
  Security Header: Content-Security-Policy
&lt;/h4&gt;

&lt;p&gt;Thanks to the hardworking RoR devs, there are some good sane default security headers for us, but there is another that we should look at called &lt;code&gt;Content-Security-Policy&lt;/code&gt;. We can thank this header so we don't get hackers loading external scripts. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Content Security Policy (CSP) is an HTTP response header that restricts the browser to loading external assets such as scripts, styles or media from a wide variety of sources — as well as inline scripts.&lt;/p&gt;
&lt;h6&gt;
  
  
  - &lt;em&gt;sqreen.com&lt;/em&gt;
&lt;/h6&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can take a look at some of these configurations below. Before making edits, make sure to read the proper documentation and implement proper gems and security when you're changing content-security-policy.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;config/initializers/content_security_policy.rb&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;content_security_policy&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;default_src&lt;/span&gt; &lt;span class="ss"&gt;:self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:https&lt;/span&gt;
  &lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;font_src&lt;/span&gt;    &lt;span class="ss"&gt;:self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:https&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:data&lt;/span&gt;
  &lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;img_src&lt;/span&gt;     &lt;span class="ss"&gt;:self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:https&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:data&lt;/span&gt;
  &lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_src&lt;/span&gt;  &lt;span class="ss"&gt;:none&lt;/span&gt;
  &lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;script_src&lt;/span&gt;  &lt;span class="ss"&gt;:self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:https&lt;/span&gt;
  &lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;style_src&lt;/span&gt;   &lt;span class="ss"&gt;:self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:https&lt;/span&gt;
  &lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;report_uri&lt;/span&gt; &lt;span class="s1"&gt;'/csp-violated'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;content_security_policy_report_only&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Security Header: Feature-Policy (experimental)
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;Feature-Policy&lt;/code&gt; header is another security header that Ruby on Rails let us configure, despite still being in the experimental state. RoR does not have documentation on this yet on their official guidelines, because of it's experimental state. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be cautious of implementing a Feature-Policy on your app or website as things are subject to change at any time due to it's experimental state.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The code in the &lt;code&gt;ActionDispatch&lt;/code&gt; module is very similar to the CSP one, and the header can be configured in the same manner.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;feature_policy&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fullscreen&lt;/span&gt; &lt;span class="ss"&gt;:fullscreen&lt;/span&gt;
  &lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;geolocation&lt;/span&gt; &lt;span class="ss"&gt;:geolocation&lt;/span&gt;
  &lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gyroscope&lt;/span&gt; &lt;span class="ss"&gt;:gyroscope&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Ruby on Rails Common Security Attacks &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;In general, as noted before, Ruby on Rails comes bundled with well-balanced appliance and safety. The built-in Rails secure password and solutions allow a basic and secure level of protection against a variety of different attacks.&lt;/p&gt;

&lt;p&gt;In the basis of the Ruby on Rails framework is a system of modules called &lt;code&gt;gems&lt;/code&gt;. Each gem contains the code and metafile in the appropriate format (YAML - "Yet Another Markup Language). &lt;/p&gt;

&lt;p&gt;A Remote Code Execution Attack can lead to a full-scale attack that would compromise an entire web application and the webserver. You should also note that virtually all programming languages have different code evaluation functions. So if a familiar RCE-exploit for YAML is inserted into the metafile and that gem is then loaded to the RubyGems server, it will allow you (the hacker) to execute any code in the context of the main Ruby code repository, thus bringing down the entire “ecosystem.”&lt;/p&gt;

&lt;p&gt;Here's a basic model of how an RCE-exploit would work:&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv5g1slvqak6v3tl5si89.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv5g1slvqak6v3tl5si89.png" alt="hackmodel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essentially, after gaining access, the attacker might try to escalate privileges. This can completely compromise a vulnerable system. &lt;/p&gt;

&lt;p&gt;We'll go into some of the most common types of security attacks of Ruby on Rails that development projects face.&lt;/p&gt;

&lt;h4&gt;
  
  
  XXS/Cross-Site Scripting
&lt;/h4&gt;

&lt;p&gt;This is one of the most widespread security breaches on Ruby on Rails projects and it can ruin a web service in its entirety. It chooses from the numerous entry points to inject malicious codes into the project. A cross-site scripting attack can be launched from search result pages, messages, comments, reviews, etc. From here, the modified and often maligned item stays integrated into the app product and is accessible to a user.&lt;/p&gt;

&lt;p&gt;Very often the malicious items stay passive for long durations in various parts of a website. This makes the structure of this particular security attack complex. It is often advised not to rely on standard XSS filters to prevent XSS attacks. If a programmer adds data in an unsafe format, such as JSON they enhance the risk. It is recommended to always convert the data to another format or avoid embedding of scripts into the transmitted data.&lt;/p&gt;

&lt;p&gt;You should also think about implementing some kind of automatic screening of potentially dangerous components to protect from XXS breaches in RoR projects. This is made possible by marking every line with a special flag html_safe. In a case where such a flag is not set, Rails filters it before the output of the variable part.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cross-Site Request Forgery
&lt;/h4&gt;

&lt;p&gt;An abbreviation for cross-site request forgery, CSRFs are found on the vulnerability of the HTTP transfer protocol. Not only does it deter the performance and work of your app or web resource, but it also functions on assumptions of already active user privileges. &lt;/p&gt;

&lt;p&gt;Here's how an attack may happen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hacker links to your application on his website, by for ample placing the malicious link in the image file.
&lt;code&gt;&amp;lt;img src="http://myrails.com/resource/1/destroy" height=0 width=0 /&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Hacker's website visitor executes the code that otherwise requires authorization - as long as his session on myrails.com didn't expire.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However, you should note that RoR has an out-of-the-box security measure against this if you follow it's conventions. &lt;/p&gt;

&lt;p&gt;With this ready-made mechanism called token authentication nothing gets executed. Those CSRF tokens are sent from the frontend to the backend layer with every form submission. If they don't match the expected ones's the request fails. Simple, yet effective.&lt;/p&gt;

&lt;h4&gt;
  
  
  SQL Injection
&lt;/h4&gt;

&lt;p&gt;This is often described as a hacker's favorite, SQL injection is often used by perpetrators to find a way to pass unverified data. Not only does an SQL injection opens access to the database but it also provides an opportunity window to mess with confidential data by changing it. Hackers often use SQL Injection to look for certain information, as it allows looking for the required records quickly. They also enjoy the liberty to inject malicious code into the records.&lt;/p&gt;

&lt;p&gt;The main consequences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Confidentiality&lt;/li&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Authorization&lt;/li&gt;
&lt;li&gt;Integrity&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Clickjacking
&lt;/h4&gt;

&lt;p&gt;A network attack that automatically redirects a user to another page without doing any harm to your site; clickjacking is lesser of evil. Hackers often use clickjacking attacks to increase the visitors of a third-party resource.&lt;/p&gt;

&lt;p&gt;RoR development environment introduced a mechanism that can prevent redirects. This can be done by adding the HTTP header “X-Frame-Options: SAMEORIGIN” to the pages created.&lt;/p&gt;




&lt;h2&gt;
  
  
  Popular Security Gems for Ruby on Rails &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Rails offers many out-of-the-box security measures as we have mentioned to protect against input validation flaws and other web-based attacks, but you have to understand that these mechanisms &lt;strong&gt;have a limit&lt;/strong&gt;. That being said, it's best to implement diverse security measures to prevent against more malicious hacking through Rails gems. I'm just going to highlight some of the industry favorites. &lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://brakemanscanner.org/" rel="noopener noreferrer"&gt;Brakeman&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Keeping all of the security vulnerabilities and measures constantly in mind is not an easy task to do, and depending on programmers memory alone is yet another security vulnerability, known as The Human Error.&lt;/p&gt;

&lt;p&gt;Thankfully, there are measures to prevent it. One such way is automated audits for scanning your app for security flaws.&lt;/p&gt;

&lt;p&gt;The most popular community choice for auditing Ruby on Rails application against security vulnerabilities is the Brakeman gem.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://github.com/heartcombo/devise" rel="noopener noreferrer"&gt;Devise&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;It is a popular authentication solution for applications in Rails. It provides a number of features such as offering secure password storage using bcrypt to hash salted passwords, user registration, and forgotten password functionality.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://github.com/github/secure_headers" rel="noopener noreferrer"&gt;secure_headers&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;This was developed by the Twitter security team. It is a gem that implements security related HTTP headers into your application’s HTTP responses. secure_headers by Twitter includes security headers, such as a content security policy, to protect against cross-site request forgery, and HSTPS to restrict a browser from communicating with a remote server via https only.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practical Security Best Practices with Ruby on Rails &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Sessions &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Session hijacking happens when a malicious user steals a legitimate user’s session ID in order to log in to a web application via the victim’s name. This form of attack is possible whether or not a user connects or makes an HTTP request to a remote web server via HTTP or HTTPS. (Information can also be accessed through Cross-Site Scripting) The only difference between HTTP and HTTPS is that an HTTPS connection has extra setup at the beginning. It negotiates a secure channel, and then it sends normal HTTP over that channel. &lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;Quick side-bar on HTTPS configuration. Because the state of the internet, you should for good reason, implement the secure HTTP protocol (HTTPS) on your application. You can do this by obtaining a SSL Certificate completely free through providers such as &lt;a href="https://letsencrypt.org/" rel="noopener noreferrer"&gt;Let's Encrypt&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once you do that, setting up the Ruby on Rails to use the secure HTTPS protocol is as easy as it gets.&lt;br&gt;
&lt;em&gt;config/environments/production.rb&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="c1"&gt;# other config&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;force_ssl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this single line of code in place, you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cookies flagged as &lt;code&gt;secure&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;HTTP Strict Transport Security (HSTS) header that instructs the browser to perform subsequent requests via HTTPS only&lt;/li&gt;
&lt;li&gt;Redirects all requests to the HTTPS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;When a user logs in to a web application, a user ID is saved for future authentication in the session token. It looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="p"&gt;[:&lt;/span&gt;  &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The attacker can steal this cookie to log in to a web application via the user’s name. Attackers can hijack sessions in diverse ways such as predicting the session token, man-in-the-middle attack, or the infamous XSS.&lt;/p&gt;

&lt;h5&gt;
  
  
  Prevention
&lt;/h5&gt;

&lt;p&gt;We can protect our cookies by using a random value in them. Let’s say attackers log in to a web application, they can easily predict the next or previous cookies by observing previous IDs. Thus, randomness of IDs is a must.&lt;/p&gt;

&lt;p&gt;Moreover, web developers should not store IDs in the following way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:secure_session&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rather, web developers should call the signed method on cookies to encrypt the value like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;cookies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signed&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt; &lt;span class="n"&gt;secure_session&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In spite of unpredictable session IDs, we need to secure the way the client makes HTTP requests to remote web servers. Without SSL, cookies can be intercepted in transit. In Rails, there are a few ways to implement SSL.&lt;br&gt;
(Mentioned in sidebar)&lt;/p&gt;
&lt;h3&gt;
  
  
  Cross-Site Request Forgery &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A malicious user who happens to be a tutorial writer has set up a CSRF attack on cyber54.com to transfer a huge amount of money from a user’s account number. The malicious code may look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;iframe&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://examplebank.com/app/transfermoney? amount=2200&amp;amp;attackersAccount"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the user uploads that iframe, the browser makes a POST request to &lt;a href="http://www.mybank.com" rel="noopener noreferrer"&gt;www.mybank.com&lt;/a&gt; It will be processed and the amount of money would be transferred to account no: 247890345.&lt;/p&gt;

&lt;h5&gt;
  
  
  Prevention
&lt;/h5&gt;

&lt;p&gt;In Rails we can prevent CSRF by authenticity_token in HTML responses. This token is also stored within the user’s session cookie.  Forms generated in Rails may contain the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;
 &lt;span class="no"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"authenticity_token"&lt;/span&gt;
        &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="n"&gt;hidden&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt; 
 &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="n"&gt;ghtyu7asdvnTojibBNYY67BshjyerUA&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;81&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="no"&gt;DD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The value of authentication_token  differs. When the form and authentication_token are submitted, Rails verify the request to decide whether the request should be processed or not.&lt;/p&gt;

&lt;h3&gt;
  
  
  SQL Injection &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Let’s say an attacker wants to perform a SQL injection on &lt;a href="http://www.example.com" rel="noopener noreferrer"&gt;www.example.com&lt;/a&gt;. The attacker might check whether the site is vulnerable to SQL injection by the following code:&lt;br&gt;
&lt;code&gt;http://www.example.com/index.php?id=2'&lt;/code&gt;&lt;br&gt;
When the remote web server serves an error page or message suggesting there is an error in our SQL syntax, then example.com is probably vulnerable to SQL injection.&lt;/p&gt;

&lt;h5&gt;
  
  
  Prevention
&lt;/h5&gt;

&lt;p&gt;In Rails, applications interact with a database through ActiveRecord, an object-relational mapping (ORM) which by default comes with Rails. Although ORM provides database abstraction, careless handling of input can lead to SQL injection. &lt;/p&gt;

&lt;p&gt;You should implement additional security measures via gems to heighten security for data such as usernames and passwords.&lt;/p&gt;

&lt;p&gt;Generally a good solution is to sanitize your rendered data via &lt;code&gt;ActionView::Helpers::SanitizeHelper&lt;/code&gt; module.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion - Securing the Cookie Jar &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Even though Ruby on Rails is seen as a &lt;em&gt;more secure&lt;/em&gt; framework it's gotten a lot of skepticism due to it's security breaches in the past. In my opinion, the RoR core team is constantly updating it's security measures and working hard to ensure a high level of base-security. If you go into RoR thinking it's base level of security is enough, it's similar to thinking if you have a lock on your door it'll be enough to prevent robbers. If you implement the many tools and guides Ruby on Rails developers suggest, you are sure to build a pretty secure and robust application using this framework. That being said there's a simple checklist you can go through when thinking about your app security.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security Checklist
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Always check unauthorized access.&lt;/li&gt;
&lt;li&gt;Use authentication practices.&lt;/li&gt;
&lt;li&gt;Make it a point to filter passwords and other sensitive data logs.&lt;/li&gt;
&lt;li&gt;Use strong parameters to whitelist the values that can be used.&lt;/li&gt;
&lt;li&gt;Fix the number of throttling requests per minute.&lt;/li&gt;
&lt;li&gt;Use HTTPs for pages that deal with sensitive information.&lt;/li&gt;
&lt;li&gt;Use tools like a static analysis security vulnerability scanner for Rails applications.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>security</category>
      <category>programming</category>
    </item>
    <item>
      <title>What kind of Developer do I want to be?</title>
      <dc:creator>Kindred</dc:creator>
      <pubDate>Wed, 24 Nov 2021 06:55:20 +0000</pubDate>
      <link>https://dev.to/kvyshh/roadmap-to-learning-what-kind-of-developerprogrammerengineer-you-are-2m2j</link>
      <guid>https://dev.to/kvyshh/roadmap-to-learning-what-kind-of-developerprogrammerengineer-you-are-2m2j</guid>
      <description>&lt;p&gt;Whether you're just starting your journey in the technical field, half way through, or fully integrated, it's always a good practice to step back in your career and ask yourself a few things: &lt;/p&gt;

&lt;h6&gt;
  
  
  (we're going to assume at this point, you've made the decision to pursue the life of a "Developer"/"Engineer"/"Programmer" -- if you're looking for a "Is tech the right choice for me?" article, this won't cover it.)
&lt;/h6&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Why am I pursuing this role? &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why am I in the role that I'm in now?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Am I still passionate about what I'm pursuing?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Am I still passionate about what I'm doing?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Where do I want to go next?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With these questions and maybe answers in mind, lets consider some options to help you build the best career path for you! &lt;/p&gt;

&lt;h6&gt;
  
  
  I want to mention that this isn't a say-all-do-all article, I wanted to create this article to help inspire or re-inspire  people about their career options and path. You should continue to do research about the many titles developers hold, and decide what's right for you.
&lt;/h6&gt;

&lt;h2&gt;
  
  
  The Journey
&lt;/h2&gt;

&lt;p&gt;The timeline of an engineer will generally be forever growing as you know may know we are what they call "eternal students". However, at the beginning it falls along these lines, and when you're looking into roles, consider where you are in this timeline.&lt;/p&gt;

&lt;h4&gt;
  
  
  Chapter 1: Introductions to programming and code.
&lt;/h4&gt;

&lt;p&gt;This is the start of your journey as a programmer; where you'll learn all the important fundamentals of code.&lt;/p&gt;

&lt;h4&gt;
  
  
  Chapter 2: Experimenting
&lt;/h4&gt;

&lt;p&gt;You're at the point where you're trying things out, learning a new language, and discover what you like and dislike.&lt;/p&gt;

&lt;h4&gt;
  
  
  Chapter 3: Specialization
&lt;/h4&gt;

&lt;p&gt;Picking a focus area and become an expert in that area.&lt;/p&gt;

&lt;h4&gt;
  
  
  Chapter 4: Expanding / Building on other skills and/or more technicality
&lt;/h4&gt;

&lt;p&gt;At this point you know what you want to do and you're looking at the best way to develop things like your leadership skills, communication, business development, or building a &lt;em&gt;new&lt;/em&gt; language&lt;/p&gt;

&lt;p&gt;... and you can keep building from there. The possibilities are endless, it just depends on how much effort, time, and money you're willing to put in.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Side-bar on the what it means to be a "Software Engineer" vs "Software Developer" vs "Programmer"
&lt;/h3&gt;

&lt;p&gt;I don't want to go into too much detail about the naming convention of the titles as a "Programmer", but I do want to mention it because I think it's important to acknowledge what it may mean in the professional field. I personally think they can be interchanged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The Programmer&lt;/em&gt;&lt;/strong&gt;: This is someone who knows how to code, They know at least one programming language and know it well enough that they can make things happen by typing the code into their computer.&lt;/p&gt;

&lt;p&gt;Some programmers graduate from a university with a computer science degree and know how to code. They would qualify. Others pick up a book and teach themselves to code on their own. They would qualify too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The Developer&lt;/em&gt;&lt;/strong&gt;: When someone talks about a developer, sometimes they use the term to mean something more than programmer. A programmer asks me, “what should I code?” or “how do you want me to do it?” In those cases, I'm making the bigger decisions and the programmer is implementing things.&lt;/p&gt;

&lt;p&gt;Developers have enough experience to have seen problems before and to know what worked and what didn't. With developers you can normally describe a destination, and they design the route they'll take. The difference between a programmer and a developer is one of degree. One is more resourceful than the other. Moving from one to the other requires time, effort, and experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The Engineer&lt;/em&gt;&lt;/strong&gt;: Software engineers are a different dynamic altogether, for some. It's because of the “engineering” part of the term.&lt;/p&gt;

&lt;p&gt;To remind you, it doesn't matter where/how software engineers gain their knowledge. It's not suggesting they must have a degree. Engineering is a discipline. It requires that you know a set of knowledge. Engineering requires a level of abstract thinking. We're not just talking about creating a plan before you write code. We're talking about creating mental models of how the parts of a system will work. Models that help you refine your designs.&lt;/p&gt;

&lt;p&gt;Conclusion: At the end of the day, what really matters is what you want to call yourself and what you believe you are. There is no "right" or "wrong" to how you title yourself (so long as you're being honest to yourself). This side-bar was just to touch on some opinions on what the title means to some people in the industry. “&lt;strong&gt;&lt;em&gt;Good programmers are good programmers, no matter what special title they have.&lt;/em&gt;&lt;/strong&gt;”&lt;/p&gt;

&lt;p&gt;-- &lt;/p&gt;

&lt;h2&gt;
  
  
  The Roadmap - Where to start.
&lt;/h2&gt;

&lt;p&gt;So if you've done any searching around into different 'developer' titles, you'll quickly realize there are about 100 different tiles you can choose from. Narrowing that down can be daunting when you're first starting out, but the good news is a lot of them can be categorized into larger 'umbrella' role-titles to help your narrow your focus.&lt;/p&gt;

&lt;h3&gt;
  
  
  Front-End Developer
&lt;/h3&gt;

&lt;p&gt;Builds websites by converting data to a graphical interface for the user to view and interact with. Their main concerns relate to the presentation layer; they need to have some artistic vision to present the data; this generally implies mastering HTML, CSS, some CSS pre-processor like SAS, and some (mainstream) JavaScript frameworks such as Angular, React or Vue.&lt;/p&gt;

&lt;h5&gt;
  
  
  Non-Technical Qualities to have:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Project Management&lt;/li&gt;
&lt;li&gt;Excellent Communication &lt;/li&gt;
&lt;li&gt;Time Management&lt;/li&gt;
&lt;li&gt;Quick/Effective Decision Making&lt;/li&gt;
&lt;li&gt;Working under pressure&lt;/li&gt;
&lt;li&gt;Attention for visual detail&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Am I a fit?
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;I like to work with people, whether it's team-members or clients, and being able to bring someones idea to life.&lt;/li&gt;
&lt;li&gt;I work well under pressure and I can handle eyes on me and my work&lt;/li&gt;
&lt;li&gt;When push comes to shove, I can make a yes or no decision on project capabilities, features, and deadlines&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Technical Skills
&lt;/h5&gt;

&lt;p&gt;HTML, CSS, Vanilla JS, jQuery, Content management systems &lt;br&gt;
BONUS: UX/UI Design Skills, Adobe Suite, Branding, Creating Guide Styles&lt;/p&gt;
&lt;h5&gt;
  
  
  Various Titles
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Front-End Engineer/Developer&lt;/li&gt;
&lt;li&gt;Web Developer/Web Designer&lt;/li&gt;
&lt;li&gt;Front-End Architect&lt;/li&gt;
&lt;li&gt;Presentation Layer Developer&lt;/li&gt;
&lt;li&gt;Interface Developer&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;
  
  
  Thinking
&lt;/h5&gt;

&lt;p&gt;Mock-up/Storyboard&lt;br&gt;
Receiving a mock-up or storyboard from a client, ux/ui designer, or design team.&lt;br&gt;
&lt;a href="https://media.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%2Fo4u93kcqs4a3an4ykpbj.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo4u93kcqs4a3an4ykpbj.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Plan of Action&lt;br&gt;
Thinking about the time it will take to build each component; is it going to be one page, multiple pages, what data is this pulling from, what are we consistently changing?&lt;br&gt;
&lt;a href="https://media.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%2Fzsra483qg7qlwdm3j9ql.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzsra483qg7qlwdm3j9ql.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Building Dynamic Code&lt;br&gt;
Creating code that any developer can read and iterate on. Making the most of re-usable code on multiple pages&lt;br&gt;
HTML&lt;br&gt;
Properly labeling and id-ing items so they can easily be accessed in CSS or through a CSS program&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;head&amp;gt;
&amp;lt;meta name="description" content=""&amp;gt;
&amp;lt;meta name="author" content="Tooplate"&amp;gt;
&amp;lt;title&amp;gt;ArtXibition HTML Event Template&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id="js-preloader" class="js-preloader"&amp;gt;
      &amp;lt;div class="preloader-inner"&amp;gt;
        &amp;lt;span class="dot"&amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;div class="dots"&amp;gt;
          &amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
          &amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
          &amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JavaScript&lt;br&gt;
Creating component based elements and styling your code so that it's easily manipulatable and readable. Notice that when you create something you want to be able to think about where and how it can be used else where.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function focusable( element, isTabIndexNotNaN ) {
    var map, mapName, img,
        nodeName = element.nodeName.toLowerCase();
    if ( "area" === nodeName ) {
        map = element.parentNode;
        mapName = map.name;
        if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
            return false;
        }
        img = $( "img[usemap='#" + mapName + "']" )[ 0 ];
        return !!img &amp;amp;&amp;amp; visible( img );
    }
    return ( /input|select|textarea|button|object/.test( nodeName ) ?
        !element.disabled :
        "a" === nodeName ?
            element.href || isTabIndexNotNaN :
            isTabIndexNotNaN) &amp;amp;&amp;amp;
        // the element and all of its ancestors must be visible
        visible( element );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CSS&lt;br&gt;
Matching the styling to the mock-up while also making it the most dynamic by applying proper class and IDs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;html, body {
  font-family: 'Poppins', sans-serif;
  font-weight: 400;
  background-color: #fff;
  font-size: 16px;
  -ms-text-size-adjust: 100%;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

a {
  text-decoration: none !important;
}

h1, h2, h3, h4, h5, h6 {
  margin-top: 0px;
  margin-bottom: 0px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Pay
&lt;/h5&gt;

&lt;p&gt;In US with 1-3 years of experience at a mid-size company: ~$97k (Junior)&lt;br&gt;
In US with 8+ years of experience at a mid-size company: ~$124 (Senior)&lt;/p&gt;
&lt;h5&gt;
  
  
  Things to consider
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;"Web Developer" is the #1 searched job-title in the development field&lt;/li&gt;
&lt;li&gt;"Front-End Engineer" is the #4 top ranking&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;
  
  
  You should reconsider if...
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;You are not looking to have EXCELLENT communication skills&lt;/li&gt;
&lt;li&gt;Don't enjoy working with a lot of different people&lt;/li&gt;
&lt;li&gt;Crack under pressure&lt;/li&gt;
&lt;li&gt;You are not the most design-oriented person and don't wish to be &lt;/li&gt;
&lt;li&gt;You are not great at managing multiple tasks and deadlines&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Back-End Developer
&lt;/h3&gt;

&lt;p&gt;Builds the functionality and interactivity of a website, including the elements that allow users to carry out actions like logging in, creating an account, and user data input. Backend developers work implementing the business logic. They have to have knowledge of frameworks, software architecture, design patterns, databases, APIs, interconnectivity, DevOps, etc. They need to be able to manage abstract concepts and complex logic.&lt;/p&gt;
&lt;h5&gt;
  
  
  Non-Technical Qualities to have:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Logical and solutions oriented &lt;/li&gt;
&lt;li&gt;Abstract thinking&lt;/li&gt;
&lt;li&gt;Pattern recognition &lt;/li&gt;
&lt;li&gt;Communication with team&lt;/li&gt;
&lt;li&gt;Detail &amp;amp; Security Oriented&lt;/li&gt;
&lt;li&gt;Researcher&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;
  
  
  Am I a fit?
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;When I'm given a problem, I like to take a moment to write down solutions and how to get there&lt;/li&gt;
&lt;li&gt;I'm always looking for more interesting ways to solve problems and make it adaptable - its not always about what is the 'shortest'&lt;/li&gt;
&lt;li&gt;I like creating systems for more efficient ways to execute on tasks&lt;/li&gt;
&lt;li&gt;I want to be sure that I have a calculated risk before I go in on something and consult with others&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;
  
  
  Technical Skills
&lt;/h5&gt;

&lt;p&gt;Python, Java, PHP, MySQL, C, C++, Ruby&lt;/p&gt;
&lt;h5&gt;
  
  
  Various Titles
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Software Engineer&lt;/li&gt;
&lt;li&gt;Back-end Engineer&lt;/li&gt;
&lt;li&gt;Data Engineer &lt;/li&gt;
&lt;li&gt;SQL/Java/[language] Engineer&lt;/li&gt;
&lt;li&gt;Network Engineer&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;
  
  
  Thinking
&lt;/h5&gt;

&lt;p&gt;Data from server/website/network&lt;br&gt;
&lt;a href="https://media.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%2Fhiy7p27rd0hi2zxg9upc.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhiy7p27rd0hi2zxg9upc.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Creating a framework for where data comes and goes as well as functionality (what to do with it)&lt;br&gt;
&lt;a href="https://media.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%2F0nncu15sjel6goxqubyl.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0nncu15sjel6goxqubyl.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building the code to consider time-space complexity but also be dynamic when needed. Data should be easily accessible by other teams and placing security measures where important data is passed. Commenting to allow other engineers to easily iterate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Job: 
        def __init__(self, start, finish, profit): 
            self.start = start 
            self.finish = finish 
            self.profit = profit 


    # A Binary Search based function to find the latest job 
    # (before current job) that doesn't conflict with current 
    # job. "index" is index of the current job. This function 
    # returns -1 if all jobs before index conflict with it. 
    def binarySearch(job, start_index): 
        # https://en.wikipedia.org/wiki/Binary_search_algorithm

        # Initialize 'lo' and 'hi' for Binary Search 
        lo = 0
        hi = start_index - 1

        # Perform binary Search iteratively 
        while lo &amp;lt;= hi: 
            mid = (lo + hi) // 2
            if job[mid].finish &amp;lt;= job[start_index].start: 
                if job[mid + 1].finish &amp;lt;= job[start_index].start: 
                    lo = mid + 1
                else: 
                    return mid 
            else: 
                hi = mid - 1
        return -1

    # The main function that returns the maximum possible 
    # profit from given array of jobs 
    def schedule(job): 
        # Sort jobs according to start time 
        job = sorted(job, key = lambda j: j.start) 

        # Create an array to store solutions of subproblems. table[i] 
        # stores the profit for jobs till arr[i] (including arr[i]) 
        n = len(job) 
        table = [0 for _ in range(n)] 

        table[0] = job[0].profit; 

        # Fill entries in table[] using recursive property 
        for i in range(1, n): 

            # Find profit including the current job 
            inclProf = job[i].profit 
            l = binarySearch(job, i) 
            if (l != -1): 
                inclProf += table[l]; 

            # Store maximum of including and excluding 
            table[i] = max(inclProf, table[i - 1]) 

        return table[n-1] 

    # Driver code to test above function 
    job = [Job(1, 2, 50), Job(3, 5, 20), 
        Job(6, 19, 100), Job(2, 100, 200)] 
    print("Optimal profit is"), 
    print(schedule(job))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Pay
&lt;/h5&gt;

&lt;p&gt;In US with 1-3 years of experience at a mid-size company: ~$117k (Junior)&lt;br&gt;
In US with 8+ years of experience at a mid-size company: ~$154k (Senior)&lt;/p&gt;

&lt;h5&gt;
  
  
  Things to consider
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Back end development can be offered as an independent service in the form of BaaS&lt;/li&gt;
&lt;li&gt;The backend web developer should understand the goals of the website and come up with effective solutions which also means understand the front-end well&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  You should reconsider if...
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;You generally give up after a few attempts at a problem&lt;/li&gt;
&lt;li&gt;You are quick to asking someone else for the answer before researching on your own&lt;/li&gt;
&lt;li&gt;You are more reactive and less risk-accessing &lt;/li&gt;
&lt;li&gt;You have don't like looking at data and working with algorithms&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  FullStack Developer
&lt;/h3&gt;

&lt;p&gt;Is able to work on both the front end and back end portions of an application or website. A full stack developer has specialized knowledge of all stages of software development, including server, network, and hosting environment; relational and non-relational databases; interacting with APIs; user interface and user experience; quality assurance; security; customer and business needs. Being a full stack developer means taking a holistic view — comparing the pros and cons of both back-end and front-end before determining where the logic should sit.&lt;/p&gt;

&lt;h5&gt;
  
  
  Non-Technical Qualities to have:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Flexibility and adaptability&lt;/li&gt;
&lt;li&gt;Very big team player and/or team leader&lt;/li&gt;
&lt;li&gt;Strategic thinking&lt;/li&gt;
&lt;li&gt;Communication skills are stellar &lt;/li&gt;
&lt;li&gt;Creativity &lt;/li&gt;
&lt;li&gt;Analytical &lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Am I a fit?
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;I can work well in most environments, whether it's internal or external&lt;/li&gt;
&lt;li&gt;I enjoy when something looks great, but also works great.&lt;/li&gt;
&lt;li&gt;I enjoy challenges and am determined to solve them in the most efficient way&lt;/li&gt;
&lt;li&gt;I like to plan things out to the detail and can communicate what I am capable of doing and not capable of doing to my team&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Technical Skills
&lt;/h5&gt;

&lt;p&gt;Front-end Languages and Frameworks (HTML, CSS, JS), Backend Technologies and Frameworks (Python, Ruby, SQL)&lt;/p&gt;

&lt;h5&gt;
  
  
  Various Titles
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;FullStack Developer&lt;/li&gt;
&lt;li&gt;Solutions Engineer&lt;/li&gt;
&lt;li&gt;FullStack QA Engineer&lt;/li&gt;
&lt;li&gt;Software Developer&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Thinking
&lt;/h5&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcsrr7ypj1mheyk2c7vf4.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcsrr7ypj1mheyk2c7vf4.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Pay
&lt;/h5&gt;

&lt;p&gt;In US with 1-3 years of experience at a mid-size company: ~$96k (Junior)&lt;br&gt;
In US with 8+ years of experience at a mid-size company: ~$128k (Senior)&lt;/p&gt;

&lt;h5&gt;
  
  
  Things to consider
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;As a full stack engineer you have a lot of opportunity to grow and decide if you want to stay full stack or go into something more specific&lt;/li&gt;
&lt;li&gt;You are a highly sought after hire currently because of your ability to do both front and back end.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  You should reconsider if...
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;You don't really enjoy doing both design/creative work and data manipulation&lt;/li&gt;
&lt;li&gt;You don't like working with multiple teams&lt;/li&gt;
&lt;li&gt;You don't have great time management or like to work on a more leisure schedule&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Mobile iOS and/or Android Developer
&lt;/h3&gt;

&lt;p&gt;Builds apps for mobile devices, including iOS and Android. A mobile developer might use Java, Swift, and Objective-C. Mobile developers can be conditionally called the front-end developer, since they mostly works with the app’s interface. However, they also play the role as the back-end developer when it comes to more complex builds that require internet connection and server communication - so in general, they stick to the Mobile Developer title.&lt;/p&gt;

&lt;h5&gt;
  
  
  Non-Technical Qualities to have:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Business knowledge&lt;/li&gt;
&lt;li&gt;Agile Methodology&lt;/li&gt;
&lt;li&gt;Collaborative&lt;/li&gt;
&lt;li&gt;Creative&lt;/li&gt;
&lt;li&gt;Communication&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Am I a fit?
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;I really enjoy the idea of having technology be mobile and making it functional&lt;/li&gt;
&lt;li&gt;I like to think about the way people use their phones and how certain apps are ran&lt;/li&gt;
&lt;li&gt;Before I go into something, I like to do more research on my audience and who might be looking at my work&lt;/li&gt;
&lt;li&gt;I take feed back well and work very well independently and on cross-functional teams&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Technical Skills
&lt;/h5&gt;

&lt;p&gt;Linux/Unix, Phython, Perl, Shell Scripting, Java, C#, Swift, ORACLE, Apache, iOS&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Design: UX/UI&lt;/li&gt;
&lt;li&gt;BONUS: Business Research, Business Development, Analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Various Titles
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Mobile App Developer&lt;/li&gt;
&lt;li&gt;App Developer&lt;/li&gt;
&lt;li&gt;iOS Engineer&lt;/li&gt;
&lt;li&gt;Android Engineer&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Thinking
&lt;/h5&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbzt2c0zgobd8avvlful.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbzt2c0zgobd8avvlful.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Pay
&lt;/h5&gt;

&lt;p&gt;In US with 1-3 years of experience at a mid-size company: ~$94k (Junior)&lt;br&gt;
In US with 8+ years of experience at a mid-size company: ~$115k (Senior)&lt;/p&gt;

&lt;h5&gt;
  
  
  Things to consider
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;There will always be a high demand for Mobile App Devs and their skill set is very specific to the Mobile environment. That being said, if you can do it you won't be out of work or find it hard to get work.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  You should reconsider if...
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;You aren't on your phone a lot&lt;/li&gt;
&lt;li&gt;Don't use a lot of Apps&lt;/li&gt;
&lt;li&gt;Don't have an interest in mobile apps&lt;/li&gt;
&lt;li&gt;Don't want to think about internet on phones&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;--&lt;/p&gt;

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

&lt;p&gt;I built this with the intention of helping people understand more about some of the most common titles as a Developer to help make better developers. I hope this was helpful.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>webdev</category>
      <category>career</category>
    </item>
    <item>
      <title>Let’s Talk About Ugly Code and Apply it to Our Lives</title>
      <dc:creator>Kindred</dc:creator>
      <pubDate>Tue, 16 Nov 2021 19:05:36 +0000</pubDate>
      <link>https://dev.to/kvyshh/lets-talk-about-ugly-code-and-apply-it-to-our-lives-1po4</link>
      <guid>https://dev.to/kvyshh/lets-talk-about-ugly-code-and-apply-it-to-our-lives-1po4</guid>
      <description>&lt;p&gt;When we talk about ‘best practices’ in programming, we’re going to assume that the people reading that article develop pretty consistent, functioning code. They’re probably looking to make their code more adaptable, cleaner, and coincide with what today’s developers consider ‘best practices’. Let’s consider that if engineer’s took programming’s best practices, translated it for real world application, and applied it to their daily lives as consistently as they applied these practices to their code, call me crazy, but I think their quality of life AND code would be an upward graph! Though in this blog post I want to talk about something less thread upon which for consistency sake, we’ll call ‘bad practices’. Developers and other professionals alike, whether they are newbies or seniors in their field, sometimes people don’t know they are practicing these bad habits. &lt;/p&gt;

&lt;p&gt;In my own code, I profess, I have practiced some of the bad habits below as well as others that are not listed. So my intention with this post is to, hopefully, by identifying poor coding practices, we can actually translate this from programmer lingo into real-world application as personal bad habits. I have a theory that if we look into breaking, avoiding, or improving on these habits in our lifestyle, then in turn, we’ll also make a conscious (and subconscious) effort to make better decisions when coding.&lt;/p&gt;

&lt;p&gt;Just to keep in mind, I gathered what I considered the most common bad practices from forum and thread research and made the real-world translations myself based on my professional and personal experience in various industries and fields such as marketing and product development. Let’s get into the ugly! &lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;h4&gt;
  
  
  Bad Coding Practice:
&lt;/h4&gt;

&lt;p&gt;Not commenting or documenting your code or providing TOO much unnecessary documentation on your code&lt;/p&gt;

&lt;p&gt;=&amp;gt; &lt;/p&gt;

&lt;h4&gt;
  
  
  Bad Personal/Professional Practice:
&lt;/h4&gt;

&lt;p&gt;Not properly planning things out and not communicating what your intentions are&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;h4&gt;
  
  
  Bad Coding Practice:
&lt;/h4&gt;

&lt;p&gt;Violating the Single Responsibility Principle (SRP) and not breaking tasks out into smaller components/functions (AVOID spaghetti code)&lt;/p&gt;

&lt;p&gt;=&amp;gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Bad Personal/Professional Practice:
&lt;/h4&gt;

&lt;p&gt;Overloading your schedule and/or plate with too many tasks, which doesn’t allow for flexibility, so you end up overwhelming yourself with too many ‘large’ tasks&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;h4&gt;
  
  
  Bad Coding Practice:
&lt;/h4&gt;

&lt;p&gt;Hard coding and inconsistent naming conventions &lt;/p&gt;

&lt;p&gt;=&amp;gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Bad Personal/Professional Practice:
&lt;/h4&gt;

&lt;p&gt;Resolving issues, arguments, problems with short, curt, and very one-sided solutions instead of having a plan of action so you can either avoid this issue in the future, or know how to handle damage-control. Not using vague statements and when you’re solving a problem or strategizing.&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;h4&gt;
  
  
  Bad Coding Practice:
&lt;/h4&gt;

&lt;p&gt;Convincing yourself that code styling isn’t that important and it looks ‘better’ on one line.&lt;/p&gt;

&lt;p&gt;=&amp;gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Bad Personal/Professional Practice:
&lt;/h4&gt;

&lt;p&gt;Consider how you communicate is not always the best way for other people to interpret what you're saying; consider the personalities you have around you and separate your thoughts out so people have time to absorb what you’re saying. That way you also can go into more detail about each of your thoughts. &lt;/p&gt;

</description>
      <category>productivity</category>
      <category>programming</category>
      <category>badpractices</category>
      <category>career</category>
    </item>
  </channel>
</rss>
