{"id":47391,"date":"2016-05-22T16:21:00","date_gmt":"2016-05-22T13:21:00","guid":{"rendered":"https:\/\/www.altoros.com\/blog\/?p=47391"},"modified":"2021-12-10T12:15:17","modified_gmt":"2021-12-10T09:15:17","slug":"things-that-i-hate-as-a-web-developer","status":"publish","type":"post","link":"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/","title":{"rendered":"Things that I Hate as a Web Developer"},"content":{"rendered":"<p>Do you remember your feelings when you had to customize <code style=\"color: black; background-color: #e6e6e6;\">activeadmin<\/code>, faced a binding problem in <a href=\"https:\/\/www.altoros.com\/blog\/evaluation-of-angularjs-a-javascript-ui-framework\/\">Angular<\/a>, or read about <code style=\"color: black; background-color: #e6e6e6;\">primitives<\/code> for the first time? There are a lot of things that irritate us as web developers. Here is my list. Feel free to add your items in the comments.<\/p>\n<p>&nbsp;<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_79_2 counter-hierarchy ez-toc-counter ez-toc-transparent ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/#Top_challenges\" >Top challenges<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/#Further_reading\" >Further reading<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"Top_challenges\"><\/span>Top challenges<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><b>Do we really need <code style=\"color: black; background-color: #e6e6e6;\">deep<\/code> functions?<\/b><\/p>\n<p>Ruby, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Ruby_on_Rails\" rel=\"noopener noreferrer\" target=\"_blank\">Ruby on Rails<\/a>, Lodash, etc., have a lot of similar functions that work in the same way, but with full depth. I can\u2019t imagine a situation when I need to copy just the first level of a hash or an array and continue by using <code style=\"color: black; background-color: #e6e6e6;\">deep<\/code> tails in links. Anyway, if there are such cases, a name for a method should be <code style=\"color: black; background-color: #e6e6e6;\">merge_first_level<\/code> instead of just <code style=\"color: black; background-color: #e6e6e6;\">merge<\/code>.<\/p>\n<p><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/05\/lodash.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/05\/lodash.png\" alt=\"\" width=\"125\" height=\"95\" class=\"aligncenter size-full wp-image-57831\" \/><\/a><\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/05\/deep-functions-web-development.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/05\/deep-functions-web-development.png\" alt=\"\" width=\"516\" height=\"396\" class=\"alignnone size-full wp-image-57864\" \/><\/a><br \/>\n<small>Examples of <code style=\"color: black; background-color: #e6e6e6;\">deep<\/code> tails in links<\/small><\/center><\/p>\n<p>&nbsp;<br \/>\n<strong>Strong parameters that permit hashes with unknown keys looking ugly<\/strong><\/p>\n<p>Here, best syntaxis suggestions were <a href=\"https:\/\/github.com\/rails\/rails\/issues\/9454\" rel=\"noopener noreferrer\" target=\"_blank\">ignored<\/a>:<\/p>\n<ul>\n<li><code style=\"color: black; background-color: #e6e6e6;\">params.require(:product).permit(:name).permit!(:data)<\/code><\/li>\n<li><code style=\"color: black; background-color: #e6e6e6;\">params.require(:product).permit(:name, :data => Hash)<\/code><\/li>\n<\/ul>\n<p>Instead, we should use a tap.<\/p>\n<pre>\r\ndef permitted_params\r\n  params.require(:product).permit(:name).tap do |while_listed|\r\n    while_listed[:data] = params[:product][:data]\r\n  end\r\nend\r\n<\/pre>\n<p>&nbsp;<br \/>\n<strong>Why do people create whitelists of parameters in wrappers?<\/strong><\/p>\n<p>Ok, I understand that it\u2019s good for security reasons. But if you give up support of your wrapper, you will make people spend time on investigating, forking, fixing, pull requesting, waiting for your reaction, and, as a result, writing in a Gemfile.<\/p>\n<p><code style=\"color: black; background-color: #e6e6e6;\">gem 'neglected_gem', github: 'me\/neglected', :ref => '4aded'<\/code><\/p>\n<p>And don\u2019t forget to use <code style=\"color: black; background-color: #e6e6e6;\">:ref<\/code>\u2014instead of getting the latest master of a forked repository\u2014to save some trees. &#x1f332;<\/p>\n<p>&nbsp;<br \/>\n<strong>Do you really need to rename scope variables to synonyms?<\/strong><\/p>\n<p>The less we change the names of variables with the same value, the less we look at the screen, and the more we save trees. &#x1f332;<\/p>\n<pre>\r\nscope:\r\n  item: '=ngModel'\r\n<\/pre>\n<pre>\r\nscope:\r\n  obligatory: '=required'\r\n<\/pre>\n<p>&nbsp;<br \/>\n<strong>A lot of duplicating of the same functionality in libraries, especially in JavaScript<\/strong><\/p>\n<p>When I see articles such as \u201cI\u2019m a web developer, and I\u2019ve been stuck with the simplest app for the last 10 days,\u201d I think it\u2019s a bad signal. It would be better to join efforts and create something amazing instead of the classic.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/05\/xkcd-standards-web-development.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/05\/xkcd-standards-web-development.png\" alt=\"\" width=\"500\" height=\"283\" class=\"alignnone size-full wp-image-57869\" \/><\/a><br \/>\n<small>xkcd standards (<a href=\"https:\/\/xkcd.com\/927\/\" rel=\"noopener noreferrer\" target=\"_blank\">Image credit<\/a>)<\/small><\/center><\/p>\n<p>&nbsp;<br \/>\n<strong>Supported technologies<\/strong><\/p>\n<p>I understand that there are a lot of activity: <code style=\"color: black; background-color: #e6e6e6;\">ES2015<\/code>, <code style=\"color: black; background-color: #e6e6e6;\">TypeScript<\/code>, <code style=\"color: black; background-color: #e6e6e6;\">HTML5<\/code>, and <code style=\"color: black; background-color: #e6e6e6;\">CSS4<\/code>. In addition, a variety of pre- and postprocessors allow you to use new syntax and new methods. Should we, though, use them if they are not yet supported by any browser, so we can employ supported technologies instead of writing the same functionality? It just makes our machines compile slow, complicates debugging, and forces using function mappings.<\/p>\n<p><center><a href=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/05\/JavaScript-API-for-processing-and-synthesizing-audio-web-development.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/05\/JavaScript-API-for-processing-and-synthesizing-audio-web-development.png\" alt=\"\" width=\"635\" height=\"157\" class=\"alignnone size-full wp-image-57862\" \/><\/a><small>A high-level JavaScript API for processing and synthesizing audio (<a href=\"https:\/\/caniuse.com\/?search=web%20audio\" rel=\"noopener noreferrer\" target=\"_blank\">Image credit<\/a>)<\/small><\/center><\/p>\n<p>&nbsp;<br \/>\n<strong>A weak quality of plug-ins<\/strong><\/p>\n<p>Once, I decided to use a plug-in for the library. I didn\u2019t want to utilize the functionality that relies on multiple dependencies of this plug-in. However, I had to add all the dependencies, because it wasn\u2019t optional. Anyway, this plug-in didn\u2019t work as expected, and I decided to write my own simple plug-in that has just one required dependency. And I realized that the last 10 versions still have serious bugs even though there were several issues on GitHub about it. I could accept some bugs if it were for a young library, but not the one with 700+ commits and a lot of tests.<\/p>\n<p>&nbsp;<br \/>\n<strong>Another example is complexity<\/strong><\/p>\n<p>I just wanted to save some time and use a library for building trees in <a href=\"https:\/\/en.wikipedia.org\/wiki\/Document_Object_Model\" rel=\"noopener noreferrer\" target=\"_blank\">the document object model<\/a> (DOM) based on the <code style=\"color: black; background-color: #e6e6e6;\">deep<\/code> object. In the beginning, it worked fine. When I was asked to add the <i>Select all<\/i> functionality, I was surprised that I should pass a flatten list to options in my tree to mark all items selected instead of just adding the <code style=\"color: black; background-color: #e6e6e6;\">_selected: true<\/code> flag. But it still worked fast and fine until I was asked to expand all nodes. While passing the same flatten list to options for expanding a node, the library did not work properly. Some nodes were expanded, some not. When I click to expand one node, another one collapses! After investigating sources, I couldn\u2019t believe that such simple functionality needs so much code. Dear colleagues, please save some trees &#x1f332; and write short, simple, and understandable code.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Further_reading\"><\/span>Further reading<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/love-ruby\/\">Love Ruby on Rails<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/websocket-rails-gem\/\">Websocket-Rails Gem<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/performance-comparison-of-ruby-frameworks-app-servers-template-engines-and-orms-2016\/\">Performance Comparison of Ruby Frameworks 2016<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>List of things that irritate us as a developers<\/p>\n","protected":false},"author":62,"featured_media":65353,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":"","_links_to":"","_links_to_target":""},"categories":[214],"tags":[1000,895],"class_list":["post-47391","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-github","tag-research-and-development"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Things that I Hate as a Web Developer | Altoros<\/title>\n<meta name=\"description\" content=\"Learn about the issues that puzzle web developers most: wrong function usage, poor quality of plug-ins, etc.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Things that I Hate as a Web Developer | Altoros\" \/>\n<meta property=\"og:description\" content=\"List of things that irritate us as a developers\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/\" \/>\n<meta property=\"og:site_name\" content=\"Altoros\" \/>\n<meta property=\"article:published_time\" content=\"2016-05-22T13:21:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-12-10T09:15:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/05\/things-that-I-hate-as-a-web-developer-featured-image-2.gif\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"798\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/gif\" \/>\n<meta name=\"author\" content=\"Eugene Melnikov\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Eugene Melnikov\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/\",\"name\":\"Things that I Hate as a Web Developer | Altoros\",\"isPartOf\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/05\/things-that-I-hate-as-a-web-developer-featured-image-2.gif\",\"datePublished\":\"2016-05-22T13:21:00+00:00\",\"dateModified\":\"2021-12-10T09:15:17+00:00\",\"author\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/2347aafc28e3658aea99b1b6671f7b70\"},\"description\":\"List of things that irritate us as a developers\",\"breadcrumb\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/#primaryimage\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/05\/things-that-I-hate-as-a-web-developer-featured-image-2.gif\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/05\/things-that-I-hate-as-a-web-developer-featured-image-2.gif\",\"width\":1280,\"height\":798},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.altoros.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Things that I Hate as a Web Developer\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\",\"url\":\"https:\/\/www.altoros.com\/blog\/\",\"name\":\"Altoros\",\"description\":\"Insight\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.altoros.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/2347aafc28e3658aea99b1b6671f7b70\",\"name\":\"Eugene Melnikov\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2020\/03\/melnikov-96x96.jpg\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2020\/03\/melnikov-96x96.jpg\",\"caption\":\"Eugene Melnikov\"},\"description\":\"Eugene Melnikov is a senior software engineer at Altoros. He mainly specializes in Ruby and Ruby-based frameworks, as well as in JavaScript development, including Node.js, jQuery, and AngularJS. Working at Altoros, Eugene has also designed and implemented a variety of SQL and NoSQL database solutions. He recently became engaged in creating data-driven software for IoT applications. Check out Eugene's GitHub profile.\",\"url\":\"https:\/\/www.altoros.com\/blog\/author\/eugene-melnikov\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Things that I Hate as a Web Developer | Altoros","description":"Learn about the issues that puzzle web developers most: wrong function usage, poor quality of plug-ins, etc.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/","og_locale":"en_US","og_type":"article","og_title":"Things that I Hate as a Web Developer | Altoros","og_description":"List of things that irritate us as a developers","og_url":"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/","og_site_name":"Altoros","article_published_time":"2016-05-22T13:21:00+00:00","article_modified_time":"2021-12-10T09:15:17+00:00","og_image":[{"width":1280,"height":798,"url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/05\/things-that-I-hate-as-a-web-developer-featured-image-2.gif","type":"image\/gif"}],"author":"Eugene Melnikov","twitter_misc":{"Written by":"Eugene Melnikov","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/","url":"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/","name":"Things that I Hate as a Web Developer | Altoros","isPartOf":{"@id":"https:\/\/www.altoros.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/#primaryimage"},"image":{"@id":"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/#primaryimage"},"thumbnailUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/05\/things-that-I-hate-as-a-web-developer-featured-image-2.gif","datePublished":"2016-05-22T13:21:00+00:00","dateModified":"2021-12-10T09:15:17+00:00","author":{"@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/2347aafc28e3658aea99b1b6671f7b70"},"description":"List of things that irritate us as a developers","breadcrumb":{"@id":"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/#primaryimage","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/05\/things-that-I-hate-as-a-web-developer-featured-image-2.gif","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/05\/things-that-I-hate-as-a-web-developer-featured-image-2.gif","width":1280,"height":798},{"@type":"BreadcrumbList","@id":"https:\/\/www.altoros.com\/blog\/things-that-i-hate-as-a-web-developer\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.altoros.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Things that I Hate as a Web Developer"}]},{"@type":"WebSite","@id":"https:\/\/www.altoros.com\/blog\/#website","url":"https:\/\/www.altoros.com\/blog\/","name":"Altoros","description":"Insight","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.altoros.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/2347aafc28e3658aea99b1b6671f7b70","name":"Eugene Melnikov","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2020\/03\/melnikov-96x96.jpg","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2020\/03\/melnikov-96x96.jpg","caption":"Eugene Melnikov"},"description":"Eugene Melnikov is a senior software engineer at Altoros. He mainly specializes in Ruby and Ruby-based frameworks, as well as in JavaScript development, including Node.js, jQuery, and AngularJS. Working at Altoros, Eugene has also designed and implemented a variety of SQL and NoSQL database solutions. He recently became engaged in creating data-driven software for IoT applications. Check out Eugene's GitHub profile.","url":"https:\/\/www.altoros.com\/blog\/author\/eugene-melnikov\/"}]}},"_links":{"self":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/47391","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/users\/62"}],"replies":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/comments?post=47391"}],"version-history":[{"count":44,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/47391\/revisions"}],"predecessor-version":[{"id":65361,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/47391\/revisions\/65361"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media\/65353"}],"wp:attachment":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media?parent=47391"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/categories?post=47391"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/tags?post=47391"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}