<?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: Dmytro Zaichenko</title>
    <description>The latest articles on DEV Community by Dmytro Zaichenko (@dzaichenko).</description>
    <link>https://dev.to/dzaichenko</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%2F488568%2F10950f05-330d-4310-bbae-6e15bd5bf6a4.jpg</url>
      <title>DEV Community: Dmytro Zaichenko</title>
      <link>https://dev.to/dzaichenko</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dzaichenko"/>
    <language>en</language>
    <item>
      <title>Should I Learn RoR in 2021?</title>
      <dc:creator>Dmytro Zaichenko</dc:creator>
      <pubDate>Fri, 18 Dec 2020 09:32:42 +0000</pubDate>
      <link>https://dev.to/dzaichenko/should-i-learn-ror-in-2021-4fda</link>
      <guid>https://dev.to/dzaichenko/should-i-learn-ror-in-2021-4fda</guid>
      <description>&lt;p&gt;&lt;em&gt;To know more about RoR, check a detailed guide &lt;a href="https://railsware.com/blog/ruby-on-rails-guide"&gt;Everything You Need to Know about Ruby on Rails Web Application Framework&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A short answer: YES&lt;br&gt;
A little bit developed answer: Yes, you should try at least.&lt;/p&gt;

&lt;p&gt;It can be tough to make up your mind about the next framework to learn with so many available options. Depending on your interests, RoR may be one of the best on the list. Why? Let’s see.&lt;/p&gt;

&lt;h3&gt;
  
  
  Community
&lt;/h3&gt;

&lt;p&gt;There’s a vibrant community around it, and over &lt;a href="https://github.com/rails/rails"&gt;4.2k contributors to the RoR GitHub page&lt;/a&gt; (the hugely popular Django, Laravel, or ReactJS don’t even have half of that). The RoR community is active and known for being very open and helpful to newcomers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Easiness
&lt;/h3&gt;

&lt;p&gt;It’s relatively easy to learn, especially if you already know JavaScript or a similar framework. The language is expressive, and the syntax is clean and easy to comprehend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quickness
&lt;/h3&gt;

&lt;p&gt;It’s quick to work with, and with the abundance of resources, you can deliver things in no time. Incredibly helpful if you’re planning to work on your own prototypes or pet projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Product-oriented approach
&lt;/h3&gt;

&lt;p&gt;Working with RoR inevitably means working closely with products. RoR teams are often found in startups, and they’re small and focused. Engineers are often exposed to customer insights and gain a deeper understanding of the product. This can be an invaluable experience if product management is your field of interest.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paycheck
&lt;/h3&gt;

&lt;p&gt;Coding in Ruby also pays well. According to the &lt;a href="https://insights.stackoverflow.com/survey/2020#overview"&gt;2020 Stack Overflow Developer Survey&lt;/a&gt;, Ruby was among the frameworks guaranteeing the highest paycheck.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logic
&lt;/h3&gt;

&lt;p&gt;Rails does many things with logical conventions, so you can focus on the core of your application. The code is clean and easy to understand and maintain. “It’s just fun to use” was a widespread response when we asked our devs why they love coding in Rails.&lt;/p&gt;

&lt;h2&gt;
  
  
  When not to choose RoR?
&lt;/h2&gt;

&lt;p&gt;When should you opt for one of the Ruby alternatives instead of choosing RoR? Whichever way you go, you’ll need to have a general understanding of JavaScript along with HTML/CSS to become a successful web developer. For this reason, if you’re just getting started, picking up JS may be the right approach.&lt;/p&gt;

&lt;p&gt;If Rails appealed to you with its MVC architecture but something else didn’t quite match, ReactJS could be a viable alternative. It’s trendy, quickly growing, and is undoubtedly in demand. The same can be said about Laravel, which has grown a fantastic community around it and provides tons of resources for those just getting started.&lt;/p&gt;

&lt;p&gt;If you always want to be on top of the latest technology trends, you can’t overlook Python and its most popular framework, Django. It offers a rich ecosystem and an abundance of features that simplify development. Many of them came from Rails and enhanced it, quickly becoming some of the all-time favorites.&lt;/p&gt;

&lt;p&gt;Among other popular options, Java-based Spring and a JS family of Angular, Vue.js, and Express should certainly not be overlooked.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post was originally published by my colleague Piotr Malek on &lt;a href="https://railsware.com/blog"&gt;Railsware blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Angular end-to-end testing tips</title>
      <dc:creator>Dmytro Zaichenko</dc:creator>
      <pubDate>Thu, 26 Nov 2020 14:52:49 +0000</pubDate>
      <link>https://dev.to/dzaichenko/angular-end-to-end-testing-tips-3afm</link>
      <guid>https://dev.to/dzaichenko/angular-end-to-end-testing-tips-3afm</guid>
      <description>&lt;p&gt;&lt;em&gt;We all love to write end-to-end specs, don’t we? The reason is that these scenarios act as watchdogs, making refactoring safer and sometimes being the one and only feature documentation existing in the codebase.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The only downside is that sometimes it takes ages to have a proper data setup, resolve CSS classes dependencies and constant CSS/HTML changes. Readability and maintainability are not always perfect too. Well, we have a few simple techniques that can help you overcome most of the issues described above. Written for end-to-end Protractor specs, they can be easily used with a testing framework you prefer.&lt;/p&gt;

&lt;p&gt;Let’s check a simple example of markup&lt;br&gt;
&lt;/p&gt;

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

    I'm an awesome label

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

&lt;/div&gt;



&lt;p&gt;with related specs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;describe('Awesome page', () =&amp;gt; {
  beforeAll(() =&amp;gt; {
    browser.driver.get("http://mysite.com/awesome");
  });

  describe('Awesome block', () =&amp;gt; {
    const block = element(by.css('.awesome-block'));
    const label = block.element(by.css('.utility-class'));

    it('has awesome label', () =&amp;gt; {
      expect(label.getText()).toEqual("I'm an awesome label");
    });
  });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and try to improve them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate test specific attributes
&lt;/h2&gt;

&lt;p&gt;If you have engineers working separately with CSS/HTML and Angular/JS components then you have probably faced an issue that markup changes are not safe in terms of spec dependencies.&lt;/p&gt;

&lt;p&gt;Front-end engineer can accidentally break specs by just changing the utility-class name or applying different class according to CSS changes. Although this issue can be avoided by checking end-to-end specs selectors whenever a markup change is applied, that’s not very convenient. An alternative solution would be having proper stable semantic classes on every tested element, but that’s just too ideal 😉&lt;/p&gt;

&lt;p&gt;The other option is to have a special attribute that is used &lt;strong&gt;ONLY&lt;/strong&gt; by testing framework:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;I'm an awesome label&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It looks like we are having obsolete attributes all around our markup. Although using this technique we have obtained a number of benefits:&lt;/p&gt;

&lt;p&gt;Every tested element has a separate meaningful name&lt;br&gt;
Markup changes are much easier and "safer"&lt;br&gt;
Specs do not dependent on CSS changes&lt;/p&gt;
&lt;h2&gt;
  
  
  Page/Component objects
&lt;/h2&gt;

&lt;p&gt;When writing end-to-end tests, a common pattern is to use page objects. It makes easier to maintain and reuse spec examples. Let’s define simple &lt;a href="https://github.com/SeleniumHQ/selenium/wiki/PageObjects"&gt;page objects&lt;/a&gt; for our specs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class PageObject {
  constructor(public finder: ElementFinder) {  }

  protected get element() {
    return this.finder.element.bind(this.finder);
  }

  protected getChild(locator: string) {
    return this.element(by.css(locator));
  }
}

class AwesomeBlock extends PageObject {
  get awesomeLabel() {
    return this.getChild('[data-test=awesome-label]');
  }
}

class AwesomePage extends PageObject {
  visit() {
    browser.driver.get("http://mysite.com/awesome"); 
  }

  get awesomeBlock() {
    return new AwesomeBlock(this.getChild('[data-test=awesome-block]'));
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test examples will now look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const page = new AwesomePage(element(by.css("body")));

describe('Awesome page', () =&amp;gt; {
  beforeAll(() =&amp;gt; {
    page.visit();
  });

  describe('Awesome block', () =&amp;gt; {
    const awesomeBlock = page.awesomeBlock;

    it('has awesome label', () =&amp;gt; {
      expect(awesomeBlock.awesomeLabel.getText()).toEqual("I'm an awesome label");
    });
  });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Much cleaner, no CSS selectors in examples but can we improve this even more? Sure! With a common test-specific attribute on every testable element and TypeScript &lt;a href="https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Decorators.md"&gt;decorators&lt;/a&gt; page objects can look a bit fancier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class AwesomeBlock extends PageObject {
  @hasOne awesomeLabel;
}

class AwesomePage extends PageObject {
  visit() {
    browser.driver.get("http://mysite.com/awesome"); 
  }

  @hasOne awesomeBlock: AwesomeBlock;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with decorator defined as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const hasOne = (target: any, propertyKey: string) =&amp;gt; {
  Object.defineProperty(target, propertyKey, {
    enumerable: true,
    configurable: true,
    get: function () {
      const child = this.getChild(`[data-test=${_.kebabCase(propertyKey)}]`);
      const PropertyClass = Reflect.getOwnMetadata("design:type", target, propertyKey);
      return new PropertyClass(child);
    },
  });
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we have reusable spec examples that are not dependent on CSS changes and a nice DSL to define Page/Component classes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The insights and code samples were made by &lt;a href="https://railsware.com/services/ruby-on-rails-web-development-services/"&gt;Railsware&lt;/a&gt; engineering team&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>testing</category>
    </item>
    <item>
      <title>How to Manage Acceptance Criteria in Jira</title>
      <dc:creator>Dmytro Zaichenko</dc:creator>
      <pubDate>Tue, 13 Oct 2020 07:23:32 +0000</pubDate>
      <link>https://dev.to/dzaichenko/how-to-manage-acceptance-criteria-in-jira-1knp</link>
      <guid>https://dev.to/dzaichenko/how-to-manage-acceptance-criteria-in-jira-1knp</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This post was originally published on &lt;a href="https://blog.jirachecklist.com/acceptance-criteria-jira/"&gt;Smart Checklist for Jira&lt;/a&gt; blog&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The success of a project depends on communication between the dev team and the customer or the stakeholder. The team needs to know how the product or feature is expected to work – this is specifically what the Acceptance Criteria in User Stories in Jira explains. &lt;/p&gt;

&lt;p&gt;The more detailed description the customer is able to provide about their business needs, the fewer questions the team will ask after work starts. Yes, the team needs to understand all requirements clearly – no question about that. Without this seemingly obvious aspect, things can become rather challenging.&lt;/p&gt;

&lt;p&gt;Let’s take the following case:&lt;/p&gt;

&lt;p&gt;The client (owner of a clothing store) wants to add a Search to their homepage so that users can search for clothes categories. They want a clear interface with filters that show all categories in the form of a dropdown. Two weeks fly by and instead of super-fast filters that show all categories, the client gets a Search where users need to type in everything manually. This also works, but the user experience will suffer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the Acceptance Criteria?
&lt;/h2&gt;

&lt;p&gt;As stated above, when a feature is built by a dev team, it must meet a certain set of rules to satisfy the user and the customer. This set is what we call Acceptance Criteria. Ultimately, the goal of the Acceptance Criteria is to ensure that the team knows what to build before work starts. Additionally, Acceptance Criteria helps to verify automated tests of the User Story. A typical example of Acceptance Criteria in a User Story list would be:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User story:&lt;/strong&gt; As a user, I want to sign up for a marketing newsletter to receive emails about the latest offers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Acceptance criteria:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The user can sign up for a newsletter in a few places: the homepage footer, the slide-in pop-up, and a modal on the product page when shopping.&lt;/li&gt;
&lt;li&gt;The user can only sign up with a valid email.&lt;/li&gt;
&lt;li&gt;There should be an Email Input on both, the slide-in pop-up and modal so that users can leave their email addresses.&lt;/li&gt;
&lt;li&gt;After the user leaves their email, they will get a confirmation email&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So to put it simply, a user will not accept the functionality if they can’t leave their email to sign up for a newsletter. They wouldn’t know if they signed up correctly without a confirmation email sent to them afterward.&lt;/p&gt;

&lt;h2&gt;
  
  
  Acceptance Criteria vs. Definition of Done
&lt;/h2&gt;

&lt;p&gt;As long as the Definition of Done and Acceptance Criteria are both present in the scrum development process, they should not be confused. They are not interchangeable. An example of a Definition of Done would be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code checked&lt;/li&gt;
&lt;li&gt;Code review passed&lt;/li&gt;
&lt;li&gt;Functional tests passed&lt;/li&gt;
&lt;li&gt;Product Owner acceptance&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  So what are the differences?
&lt;/h3&gt;

&lt;p&gt;The main difference between the two is that the Definition of Done applies to all User Stories in the backlog, while Acceptance Criteria is unique for individual Stories. While Acceptance Criteria explains how things will work, the Definition of Done is a list of items that have to be “checked” by the team before shipping a product, a release, or even the slightest feature.&lt;/p&gt;

&lt;p&gt;Also, the two serve a different purpose. The goal of DoD is to ensure the highest quality of the product, whereas the Acceptance Criteria serves as a guide for the team to let them know how the user will interact with the product as well as when the Story is eventually completed.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to manage Acceptance Criteria with Smart Checklist
&lt;/h2&gt;

&lt;p&gt;If you’re wondering where to add Acceptance Criteria in Jira, we’ve got you covered. There are a few ways to do this. Some prefer to include it in the Description text area as a simple list, which isn’t the most perfect solution. &lt;a href="https://marketplace.atlassian.com/apps/1216451/smart-checklist-for-jira-enterprise?hosting=cloud&amp;amp;tab=overview"&gt;Smart Checklist for Jira&lt;/a&gt;  makes it so easy to manage Acceptance Criteria in Jira, without the need to squeeze it inside the task’s description.&lt;/p&gt;

&lt;p&gt;All it takes is just a few clicks to download and install Smart Checklist. You will then see the tab to the right side of each of your existing User Stories and every next Story that you create.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding Acceptance Criteria in Jira
&lt;/h2&gt;

&lt;p&gt;Once installed, Click Open Smart Checklist to start adding the Acceptance Criteria list for the Story.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4nz_4LkZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/c6gtf5p80ijfdkzp8h9u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4nz_4LkZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/c6gtf5p80ijfdkzp8h9u.png" alt="Screenshot 2020-06-16 at 21.14.42"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The great thing is that Smart Checklist gives you a little bit of flexibility – you can add items to the list one by one or open the Fullscreen Editor to edit the entire list at once. Click the Pen icon to open the Editor.&lt;/p&gt;

&lt;p&gt;Now, you can use this Formatting Guide to perfectly style your list, as it supports Markdown features where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Means “To Do”&lt;/li&gt;
&lt;li&gt;Means “Done”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;[~] Means “In Progress”&lt;br&gt;
[x] Means “Cancelled”&lt;br&gt;
[#] Is the List Header &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tc24dFtg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t90lgwz8j576i2ud62tm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tc24dFtg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/t90lgwz8j576i2ud62tm.png" alt="Screenshot 2020-06-16 at 22.01.49"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you’re done, hit Save. The entire list will appear to the right side of the User Story. The list will appear at the center, under the User Story’s description by default. You can move it to the right if you prefer at any time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--47O99KQo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/e2y7kxyxo87lu3j0m4qv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--47O99KQo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/e2y7kxyxo87lu3j0m4qv.png" alt="Screenshot 2020-06-16 at 22.17.38"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;p&gt;At the end of the day, all the reasons behind adding Acceptance Criteria to your User Stories are unbeatable. That is because a well-written, clear acceptance criteria list saves you and your team from some unexpected issues on the day of release (or after it). On top of it all, it guarantees that everyone, stakeholders, clients, devs, and the users are happy with how the product works.&lt;/p&gt;

</description>
      <category>productivity</category>
    </item>
  </channel>
</rss>
