<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Mehdi Khalili</title>
    <description>Executive leader, mentor, change agent
</description>
    <link>https://www.mehdi-khalili.com/</link>
    <atom:link href="https://www.mehdi-khalili.com/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Tue, 02 Jan 2024 06:37:28 +0000</pubDate>
    <lastBuildDate>Tue, 02 Jan 2024 06:37:28 +0000</lastBuildDate>
    <generator>Jekyll v3.9.3</generator>
    
      <item>
        <title>Product launch checklist</title>
        <description>&lt;p&gt;A few months ago, I was talking with a client about things they should consider before launching a new product we, Readify, were helping them to build. I put a list together and walked them through it.&lt;/p&gt;

&lt;p&gt;I thought I’d document the checklist here for future reference. This by no means is an exhaustive list of everything you need to consider; but rather a list of things I’ve seen commonly overlooked. Then again, there is a lot in here. Just cherrypick what’s applicable to your particular case.&lt;/p&gt;

&lt;p&gt;I am assuming you already know how to deliver quality software. With that out of the way, here’s the list.&lt;/p&gt;

&lt;h3 id=&quot;user-experience&quot;&gt;User Experience&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Before doing anything else, identify and validate the problem you’re working on. &lt;a href=&quot;https://www.ideou.com/pages/design-thinking&quot;&gt;Design Thinking&lt;/a&gt; is your friend here.&lt;/li&gt;
  &lt;li&gt;Perform user/usability testing, as you start creating prototypes and develop features. I’ve had good experience with &lt;a href=&quot;https://www.usertesting.com/services&quot;&gt;User Testing&lt;/a&gt;. A few things to consider for usability testing:
    &lt;ul&gt;
      &lt;li&gt;Who to test the product with?&lt;/li&gt;
      &lt;li&gt;Developing personas for usability testing (and early adopters)&lt;/li&gt;
      &lt;li&gt;How and where do you find users?&lt;/li&gt;
      &lt;li&gt;Prepare the usability scripts and scenarios&lt;/li&gt;
      &lt;li&gt;Arrange and run interviews&lt;/li&gt;
      &lt;li&gt;What to feed back into the roadmap and what to discount&lt;/li&gt;
      &lt;li&gt;Do you need confidentiality agreement for external user testing?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;product-management&quot;&gt;Product Management&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Use a sound product market fit process and strategy. I am a big fan of &lt;a href=&quot;http://theleanstartup.com/&quot;&gt;Lean Startup&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Perform a competitor analysis to see what others are doing.&lt;/li&gt;
  &lt;li&gt;Are you doing soft launch or big bang release? Do soft launch whenever possible.&lt;/li&gt;
  &lt;li&gt;Create and maintain a product roadmap. Refine the roadmap based on market analysis as well as the feedback from usability testing and early adopters.&lt;/li&gt;
  &lt;li&gt;Do you publish your roadmap? How far into the future? Don’t commit to long term roadmap. Your roadmap will change by the time you get there.&lt;/li&gt;
  &lt;li&gt;How do you gather feedback from your users? How do you prioritise their feedback along new feature development?&lt;/li&gt;
  &lt;li&gt;What needs to be in place before you release the product to early adopters? What needs to be in place before you open the flood gates?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;marketing&quot;&gt;Marketing&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Find a name! Sounds kinda funny; but a lot of people fail at this. A few considerations:
    &lt;ul&gt;
      &lt;li&gt;Brainstorm around possible names&lt;/li&gt;
      &lt;li&gt;Google them to make sure they don’t point to existing products and services or to bad press&lt;/li&gt;
      &lt;li&gt;Make sure the name you pick is google-able; e.g. don’t name your product &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;go&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;Make sure there are some domain available for that name&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Buy your domain and consider buying a few other top layer domain names for your domain; e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.com&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.com.au&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.net&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.io&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Define a tagline for the product.&lt;/li&gt;
  &lt;li&gt;Define a pricing structure and strategy. Test your pricing structure with your early adopters. Do you provide a different pricing for your early adopters?&lt;/li&gt;
  &lt;li&gt;Think about marketing. Do you need a landing page? Who’s going to write the copy? Who’s going to design the landing page? Who’s going to do SEO?&lt;/li&gt;
  &lt;li&gt;If you don’t have this already, design a clear brand identity; i.e. colour palettes, icons, style guides etc.&lt;/li&gt;
  &lt;li&gt;Do you want to have a launch “party”? Do you know your launch date?&lt;/li&gt;
  &lt;li&gt;Consider a launch plan. Are there magazines, blogs or publications you want to target to promote the launch of your product? Have your articles, tweets etc ready in advance.&lt;/li&gt;
  &lt;li&gt;Do you need a social media presence?
    &lt;ul&gt;
      &lt;li&gt;What’s the social media persona you want to embody?&lt;/li&gt;
      &lt;li&gt;Who’s going to be the social media person?&lt;/li&gt;
      &lt;li&gt;Who’s going to write tweets and updates?&lt;/li&gt;
      &lt;li&gt;Do you need an approval process for new updates and responses?&lt;/li&gt;
      &lt;li&gt;Is the twitter handle available?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;business-processes&quot;&gt;Business Processes&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;How are you going to sell your product? Where can your customers find your product?&lt;/li&gt;
  &lt;li&gt;Can you accept payment from your customers?&lt;/li&gt;
  &lt;li&gt;Who’s going to provide application support for end users and how? Phone support, in-person, in-app chat, Facebook, Twitter etc?&lt;/li&gt;
  &lt;li&gt;Is your product used globally? If yes, (how) will you provide round the clock support?&lt;/li&gt;
  &lt;li&gt;How do you train your support staff with upcoming features?&lt;/li&gt;
  &lt;li&gt;How will you communicate changes and new features to your users?&lt;/li&gt;
  &lt;li&gt;Do you need to develop help, documentation or FAQ for the product? Try to aim for a product that’s so user friendly it doesn’t need a lot of support or training.&lt;/li&gt;
  &lt;li&gt;Do you have a CRM? Does it fit this product?&lt;/li&gt;
  &lt;li&gt;Create privacy agreements for your users&lt;/li&gt;
  &lt;li&gt;Create license agreement for your users/customers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;security&quot;&gt;Security&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;What kind of data would you be storing - PII, PCI, PHI?&lt;/li&gt;
  &lt;li&gt;What sort of regulations do you need to comply with - APP, GDPR, IRAP, NEHTA etc?&lt;/li&gt;
  &lt;li&gt;Do you have data sovereignty requirements?&lt;/li&gt;
  &lt;li&gt;Consider creating a responsible disclosure policy/guideline. Checkout &lt;a href=&quot;https://www.tesla.com/about/security&quot;&gt;Tesla’s&lt;/a&gt; for inspiration.&lt;/li&gt;
  &lt;li&gt;Consider bug bounty programs; e.g. &lt;a href=&quot;https://www.bugcrowd.com/bug-bounty-list/&quot;&gt;bugcrowd&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Create a data retention and destruction policy.&lt;/li&gt;
  &lt;li&gt;Create a data breach response policy.&lt;/li&gt;
  &lt;li&gt;Consider creating a BCP and DR policy.&lt;/li&gt;
  &lt;li&gt;Do you have a security monitoring and alerting system in place?&lt;/li&gt;
  &lt;li&gt;Consider performing penetration testing.
    &lt;ul&gt;
      &lt;li&gt;Do some research and find reputable pen testers.&lt;/li&gt;
      &lt;li&gt;Do you want to do blackbox, greybox or whitebox testing?&lt;/li&gt;
      &lt;li&gt;How often would you redo the test?&lt;/li&gt;
      &lt;li&gt;Does the vendor allow free/discounted retest if they find vulnerabilities? If yes, what’s the grace period?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;technical&quot;&gt;Technical&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Do you have a logging, monitoring and alerting system?&lt;/li&gt;
  &lt;li&gt;Do you have a sound backup strategy in place? Do you test your backups on a regular basis?&lt;/li&gt;
  &lt;li&gt;Do your BCP and DR policy cover your technical recovery? What’s your mean time to recovery?&lt;/li&gt;
  &lt;li&gt;Have you done load and stress testing on your app? Can you monitor your application performance proactively?&lt;/li&gt;
  &lt;li&gt;Do you have health dashboards setup?&lt;/li&gt;
  &lt;li&gt;Can you do zero downtime release? This is much more critical if you are working on a globally used product with no “after hours”.&lt;/li&gt;
  &lt;li&gt;What’s your SLA? Do you have maintenance window? Is it communicated in the license agreement?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What have I missed? What do you take into account for a product launch?&lt;/p&gt;
</description>
        <pubDate>Sun, 12 Aug 2018 00:00:00 +0000</pubDate>
        <link>https://www.mehdi-khalili.com/product-launch-checklist</link>
        <guid isPermaLink="true">https://www.mehdi-khalili.com/product-launch-checklist</guid>
        
        <category>Product</category>
        
        
      </item>
    
      <item>
        <title>Reinventing myself</title>
        <description>&lt;p&gt;One night, as I was laying on my bed in early 2018 thinking about the purpose of life, a question came to mind: “&lt;em&gt;How will I feel at my death bed? What regrets will I have?&lt;/em&gt;”. This led me down a path of soul searching and self discovery for several months, trying to make sense of who I really am and what I really want in life.&lt;/p&gt;

&lt;p&gt;This is the outcome of that journey, my personal mission statement, what I stand for and what I want to accomplish in my life.&lt;/p&gt;

&lt;h2 id=&quot;mission-statement&quot;&gt;Mission Statement&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;I live a life of contribution, with integrity and empathy, and I take full responsibility for my health, happiness, relationships and career.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When I die, I want to be remembered by family, colleagues and friends as a trustworthy caring person who had a lasting positive impact on their lives and the lives of others.&lt;/p&gt;

&lt;h2 id=&quot;principles&quot;&gt;Principles&lt;/h2&gt;
&lt;p&gt;I centre my life and every decision I make by following these principles:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Integrity&lt;/strong&gt;: I honour my word.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Empathy&lt;/strong&gt;: I seek to understand others by seeing the world through their feelings, thoughts and experiences.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Courage&lt;/strong&gt;: I say and do what I feel is right, even when it’s risky to do so.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Humility&lt;/strong&gt;: I don’t let my ego control me or hurt others.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Accountability&lt;/strong&gt;: I take complete ownership of my life and what happens to and around me.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;personal-development-practices&quot;&gt;Personal development practices&lt;/h2&gt;
&lt;p&gt;Here is a few practices that I will try and embed in my life to enable me and my mission:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Exercise regularly&lt;/li&gt;
  &lt;li&gt;Spend quality time with my wife and kids&lt;/li&gt;
  &lt;li&gt;Call three friends every week&lt;/li&gt;
  &lt;li&gt;Cultivate an attitude of mindfulless and gratitude&lt;/li&gt;
  &lt;li&gt;Read and write regularly&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sun, 05 Aug 2018 00:00:00 +0000</pubDate>
        <link>https://www.mehdi-khalili.com/reinventing-myself</link>
        <guid isPermaLink="true">https://www.mehdi-khalili.com/reinventing-myself</guid>
        
        <category>Personal Notes</category>
        
        
      </item>
    
      <item>
        <title>Listen, Challenge, Commit!</title>
        <description>&lt;p&gt;&lt;strong&gt;Listen&lt;/strong&gt; wholeheartedly, &lt;strong&gt;challenge&lt;/strong&gt; others with respect, &lt;strong&gt;commit&lt;/strong&gt; to a decision, regardless of whether you agree with it or not, and execute on that commitment. This simple decision making process helps you build highly productive and cohesive teams.&lt;/p&gt;

&lt;h3 id=&quot;listen&quot;&gt;Listen&lt;/h3&gt;
&lt;p&gt;“&lt;em&gt;Most people do not listen with the intent to understand; they listen with the intent to reply.&lt;/em&gt;” - Stephen R. Covey&lt;/p&gt;

&lt;p&gt;And some people don’t even listen - they either completely tune out as the other person speaks or constantly interrupt them!&lt;/p&gt;

&lt;p&gt;To create a productive team, the first and most important step is to listen. When I say &lt;em&gt;listen&lt;/em&gt;, I don’t mean to hear the other person. I mean listen to them with empathy. Put yourself in their shoes and see the world from their point of view, be genuinely curious and ask questions to understand their feelings, pain points and goals.&lt;/p&gt;

&lt;p&gt;A lot of arguments happen because people don’t listen wholeheartedly to others. It is easy to get defensive and argumentative when you feel the other person doesn’t care about your idea. So it’s very critical that during this phase you don’t interrupt, disagree, or even agree. You do one and only one thing: you listen intently.&lt;/p&gt;

&lt;h3 id=&quot;challenge&quot;&gt;Challenge&lt;/h3&gt;
&lt;p&gt;“&lt;em&gt;The ultimate measure of a man is not where he stands in moments of comfort and convenience, but where he stands at times of challenge and controversy.&lt;/em&gt;” - Martin Luther King, Jr.&lt;/p&gt;

&lt;p&gt;Challenging, as awkward and uncomfortable it might be, is critical to make a good decision, grow a team, and create cohesion and trust between team members. Without challenging, you may make a wrong decision, or even if the decision is right, you may not buy into it without fully understanding its details.&lt;/p&gt;

&lt;p&gt;So after everyone’s had a turn in presenting their ideas, you move to the second step - Challenge. Make this transition very clear and explicit. Up to this point, no one was allowed to agree, disagree or argue with others. This is your chance to challenge others. The goal is not to win an argument. The goal is to build on each others’ ideas or to explain your view and get buy in. So don’t hold anything back in this phase. If you disagree with someone, explain your objection clearly and respectfully.&lt;/p&gt;

&lt;p&gt;People repeat themselves over and over again when they don’t feel heard or understood, and challenging, without listening, could turn into a heated argument. So everything I said above about listening applies just as much here. When someone’s challenging an idea, everyone needs to tune in, listen to them intently, empathise with their objective, fears and uncertainties about the idea.&lt;/p&gt;

&lt;p&gt;Don’t interrupt the flow, don’t get defensive, don’t cut conversations short and don’t hold anything back. It’s a lot cheaper to make a right decision everyone buys into than to make a rushed one. At the same time, don’t go around the circle or on tangents. Move to the next step once everyone’s raised their objections and explained their ideas.&lt;/p&gt;

&lt;h3 id=&quot;commit&quot;&gt;Commit&lt;/h3&gt;
&lt;p&gt;“&lt;em&gt;When you’re surrounded by people who share a passionate commitment around a common purpose, anything is possible.&lt;/em&gt;” - Howard Schultz&lt;/p&gt;

&lt;p&gt;Once you’ve made a decision, regardless of who agreed or disagreed with it, &lt;strong&gt;everyone should commit and execute it like it’s their own decision&lt;/strong&gt;. There is no argument, no challenge, no “&lt;em&gt;but I didn’t agree&lt;/em&gt;”. Everyone has fully discussed their ideas and challenged others. You are heard and understood. The only thing that matters now is the decision made by the team. Roll up your sleeves and help your team execute on that idea with the best of your ability.&lt;/p&gt;

&lt;p&gt;Not every decision can be made with involvement from everyone though. Many times, particularly in larger organisations, you find yourself executing a decision made by another group. Now what?!&lt;/p&gt;

&lt;p&gt;You have two choices: you can fully commit to the decision and execute it as if it was yours, or you can choose not to commit. Let’s break this down and see it in action:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;It’s a &lt;strong&gt;great decision&lt;/strong&gt; and you &lt;strong&gt;commit&lt;/strong&gt;: it can’t get any better than this.&lt;/li&gt;
  &lt;li&gt;It’s a &lt;strong&gt;great decision&lt;/strong&gt; and you &lt;strong&gt;don’t commit&lt;/strong&gt;: you just obstructed your team and organisation from achieving its full potential. A decision or idea, no matter how great, is doomed to fail without proper commitment and execution.&lt;/li&gt;
  &lt;li&gt;It’s a &lt;strong&gt;bad decision&lt;/strong&gt; and you &lt;strong&gt;don’t commit&lt;/strong&gt;: without commitment you don’t invest much effort into it. You waste a lot of time without achieving much; so no one, including your boss, buys into your arguments around why it’s a bad idea, and if the decision fails, you might be blamed for it because of your lack of commitment.&lt;/li&gt;
  &lt;li&gt;It’s a &lt;strong&gt;bad decision&lt;/strong&gt; and you &lt;strong&gt;commit&lt;/strong&gt;: you show your full commitment and give it your best shot even though you think it’s a bad decision. With full commitment, you can try multiple approaches and come to an objective conclusion. With your full commitment, what appeared to be a bad decision might actually turn out to be a great one. Even if it doesn’t, when you go to your boss and say “&lt;em&gt;hey, I’ve tried these approaches and this doesn’t seem to work. I don’t think this is a good idea&lt;/em&gt;”, you have much higher chance of being heard.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You see - it doesn’t matter if the decision you’re handed seems to be a good or a bad one. Everyone wins when you commit and everyone loses when you don’t. Commitment is the difference between doers and whiners, achievers and victims, great teams and average ones.&lt;/p&gt;

&lt;p&gt;A team is not a team without commitment - it’s a collection of individuals with personal agendas. We’ve all worked in those teams - they’re not fun!&lt;/p&gt;

&lt;h3 id=&quot;teams-with-no-ownership&quot;&gt;Teams with no ownership&lt;/h3&gt;
&lt;p&gt;I know quite a few managers and executives who complain about lack of ownership and commitment from their team! In fact I used to be one of them.&lt;/p&gt;

&lt;p&gt;Most people don’t wake up in the morning aspiring to be a blocker or slacker. They want to do something they like and value. The challenge is that it’s hard to commit when your ideas are not valued and your voice is not heard.&lt;/p&gt;

&lt;p&gt;A lot of companies move the decisions to where the information is: to higher management. Ironically, your chances of making a good decision is quite limited if you’re not involved in day to day execution of it. If you want commitment, share the information with those who should execute the decision and/or live with its consequences, listen to them, challenge and coach them, and involve them in the decision making process. I am absolutely certain you will get much more commitment from your team when you do this.&lt;/p&gt;

&lt;h3 id=&quot;listen-challenge-commit&quot;&gt;Listen, Challenge, Commit&lt;/h3&gt;
&lt;p&gt;“&lt;em&gt;Leadership is the art of giving people a platform for spreading ideas that work.&lt;/em&gt;” – Seth Godin&lt;/p&gt;

&lt;p&gt;Listen, Challenge, Commit is a very simple decision making process for creating great teams. The process, while simple, is not easy to implement: most of us are really bad at listening, we find challenging awkward and uncomfortable, and don’t fully honour our words.&lt;/p&gt;

&lt;p&gt;You might find it hard to start with this; but I’m certain you will get better the more you try it. One thing that certainly helps implement such a process is communicating your values and expectations clearly with your team. &lt;a href=&quot;/be-clear-and-explicit-about-your-values-and-expectations&quot;&gt;Here is how I communicated my values and expectations&lt;/a&gt; with a team I led a while back. As you see, there is a lot of alignment between this process and my values, and that made it somewhat easier.&lt;/p&gt;

&lt;p&gt;I hope this helps. Leave me a comment and let me know what you think and please let me know how you go if you decide to give this a shot. I’m also keen to hear about your approach to decision making and execution, if you have a different process.&lt;/p&gt;
</description>
        <pubDate>Sat, 23 Jun 2018 00:00:00 +0000</pubDate>
        <link>https://www.mehdi-khalili.com/listen-challenge-commit</link>
        <guid isPermaLink="true">https://www.mehdi-khalili.com/listen-challenge-commit</guid>
        
        <category>Leadership</category>
        
        <category>Management</category>
        
        
      </item>
    
      <item>
        <title>Position descriptions are harmful</title>
        <description>&lt;p&gt;Companies go through so much pain to hire the best and brightest (at least good ones do) and when they find the one after spending countless hours interviewing many, they give them a position description that can be more or less translated to &lt;em&gt;“We don’t really care what value you can add to our business. All we really expect from you is the following bullet points.”&lt;/em&gt;. This is not all on employers. A lot of employees demand a position description if not given one!&lt;/p&gt;

&lt;p&gt;Here’s a few questions I’ve heard and conversations I’ve had over the years.&lt;/p&gt;

&lt;h4 id=&quot;how-can-i-do-performance-reviews-without-a-position-description&quot;&gt;&lt;em&gt;How can I do performance reviews without a position description?&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://www.amazon.com/Get-Rid-Performance-Review-Managing---ebook/dp/B00351DSNW/ref=sr_1_2&quot;&gt;You should NOT do performance reviews&lt;/a&gt;. Performance reviews are negative, intimidating and harmful. What you should do instead is regular informal catch ups with your team. We are humans. We don’t need an annual process. We can talk.&lt;/p&gt;

&lt;p&gt;When you’re unhappy with the performance of a team member, you shouldn’t wait a year to tell them. As you wait longer, the under performance or the bad behaviour rubs on you; so you get (passive) aggressive towards them, and that becomes a mutual interaction over time which makes them and you less happy and productive. Instead talk with them as soon as you see a problem and work with them to fix it.&lt;/p&gt;

&lt;p&gt;Likewise, when a team member does something great, don’t wait a year to tell them. Tell them straightaway so they know their good work is seen and acknowledged.&lt;/p&gt;

&lt;h4 id=&quot;but-how-can-i-do-pay-reviews-if-i-am-not-doing-performance-reviews&quot;&gt;&lt;em&gt;But how can I do pay reviews if I am not doing performance reviews?&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;One thing that is worse than annual performance reviews is &lt;a href=&quot;https://hbr.org/2014/01/stop-basing-pay-on-performance-reviews&quot;&gt;tying salary review to it&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;without-a-position-description-i-dont-know-what-my-manager-expects-from-me&quot;&gt;&lt;em&gt;Without a position description, I don’t know what my manager expects from me!&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;Really?! When was the last time you read your PD? More importantly, when was the last time you talked to your manager and asked her how you are going and if there are things you can improve on?&lt;/p&gt;

&lt;p&gt;Do NOT replace regular human interactions with a document with a few bullet point on it. If you like your company and want to still work there in a few years, do NOT use your PD as the basis for what you should and shouldn’t do. Ask your manager and peers for feedback, frequently.&lt;/p&gt;

&lt;h4 id=&quot;we-have-position-descriptions-and-our-employees-are-very-passionate-committed-and-creative&quot;&gt;&lt;em&gt;We have position descriptions and our employees are very passionate, committed and creative&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;Great. Putting position description aside for a second, few companies can maintain passion, commitment and creativity in their employees. So, well done.&lt;/p&gt;

&lt;p&gt;Getting back to position description, I have written plenty of them and in my experience they are very time consuming to write and maintain. Requiring that much effort and time, I would love to hear what value you, your boss or your employees are getting from them and if you could do the same or better without them. Please leave me a comment.&lt;/p&gt;

&lt;h4 id=&quot;how-can-i-hire-without-a-position-description&quot;&gt;&lt;em&gt;How can I hire without a position description?&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;This is a large topic that deserves its own post. In a nutshell, instead of selling a position by describing it, you should sell your vision, culture and working environment. When you’ve done that, you can then highlight what sort of values and skills your are after. A slight but a huge difference: instead of describing a role, you describe who YOU are as a business or team and who you’re after.&lt;/p&gt;

&lt;h3 id=&quot;issues-with-pds-in-a-nutshell&quot;&gt;Issues with PDs in a nutshell&lt;/h3&gt;
&lt;p&gt;To summarise the issues I have with position descriptions:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;PDs take a very long time to create.&lt;/li&gt;
  &lt;li&gt;They are also a snapshot in time and don’t change over time while the role, expectations, skillset and even the industry are constantly changing.&lt;/li&gt;
  &lt;li&gt;So to keep PDs relevant, you would have to spend a lot of time maintaining them.&lt;/li&gt;
  &lt;li&gt;That’s a lot of effort for no value because (hopefully) no one uses them.&lt;/li&gt;
  &lt;li&gt;Well, except for performance reviews I guess.&lt;/li&gt;
  &lt;li&gt;But performance reviews are such a bad idea to begin with.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;an-alternative-to-position-description&quot;&gt;An alternative to position description&lt;/h3&gt;
&lt;p&gt;I don’t think anyone gets off the bed in the morning and thinks: &lt;em&gt;“I am going to be a really crappy employee today, produce a little bit of outcome with shitty quality, and make my team and manager’s life difficult”&lt;/em&gt;. Most employees want to be the best. They want to do high quality work. They just don’t know how to go about doing it. They don’t know what they’re expected to do. As a leader, you should &lt;a href=&quot;/be-clear-and-explicit-about-your-values-and-expectations&quot;&gt;be clear and explicit about your values and expectations&lt;/a&gt;. Then, if there is misalignment between your values and what your employee does, talk with them straightaway, understand their point of view and help them understand yours. Coach and mentor them, and learn from them. Likewise and as importantly, if they do something great, acknowledge and reward it.&lt;/p&gt;

&lt;h4 id=&quot;but-what-if-i-train-them-and-they-leave&quot;&gt;&lt;em&gt;But what if I train them and they leave?&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;What if you don’t, and they stay?!&lt;/p&gt;

&lt;h4 id=&quot;some-people-are-not-coachable-and-are-making-a-negative-impact-on-my-team&quot;&gt;&lt;em&gt;Some people are not coachable and are making a negative impact on my team”&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;Nothing brews as fast as negativity in a team. I have touched on this in an old post titled &lt;a href=&quot;/dealing-with-net-negative-producing-programmers&quot;&gt;dealing with net negative producing programmers/personnel&lt;/a&gt;. Don’t waste your time trying to coach the uncoachable or shoehorn someone into your company’s culture. If they don’t fit, make it clear, ask them to leave and put yourself, your team and the misfit out of misery. You should also reflect on how you got there. Was it a bad hire? If yes, is there anything you can do to improve your hiring process and avoid this in the future? Or was it mismanagement? Could that person have been managed to be much more productive and effective? Learn from your mistakes, improve and move on.&lt;/p&gt;
</description>
        <pubDate>Tue, 18 Jul 2017 00:00:00 +0000</pubDate>
        <link>https://www.mehdi-khalili.com/position-descriptions-are-harmful</link>
        <guid isPermaLink="true">https://www.mehdi-khalili.com/position-descriptions-are-harmful</guid>
        
        <category>Leadership</category>
        
        <category>Management</category>
        
        
      </item>
    
      <item>
        <title>Be clear and explicit about your values and expectations</title>
        <description>&lt;p&gt;I recently joined &lt;a href=&quot;https://simplehq.co/blog/the-story-of-simple/&quot;&gt;Simple&lt;/a&gt; as the CTO. Inspired by &lt;a href=&quot;https://conantleadership.com/&quot;&gt;Doug Conant&lt;/a&gt;, I communicated my values and expectations with everyone in the team and organisation very clearly, and this has had a big positive impact on my relationship with my colleagues.&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;The people with whom you work are not mind readers. Tell them who you are, what’s important to you, and how you intend to lead.&lt;/p&gt;&amp;mdash; Doug Conant (@DougConant) &lt;a href=&quot;https://twitter.com/DougConant/status/795430744579571712&quot;&gt;November 7, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;h3 id=&quot;before-i-started&quot;&gt;Before I started&lt;/h3&gt;
&lt;p&gt;Before I started, I sent an email to the CEO and the technology leadership team to discuss what I stand for. After highlighting my pledge and expectations (more about this further down), the email ended with:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I will communicate these with the entire team on my first day at Simple. If you have concerns about any of these please let me know and we can discuss them; otherwise I expect full support from you to deliver on these.&lt;/p&gt;

  &lt;p&gt;Thanks&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The response I got from everyone was quite positive. So I arranged a meeting with all head office staff at 9:30AM on my first day.&lt;/p&gt;

&lt;h3 id=&quot;first-day&quot;&gt;First Day&lt;/h3&gt;
&lt;p&gt;This is the gist of what I discussed with everyone on the first day (omitted the personal introduction for brevity).&lt;/p&gt;

&lt;p&gt;I am here on a mission. My mission is to build a world class software team that defies any challenge and creates products that customers love.&lt;/p&gt;

&lt;p&gt;To succeed in this mission, I make a pledge to you and have a few expectations from you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My pledge:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I &lt;strong&gt;respect&lt;/strong&gt; each and everyone of you.&lt;/li&gt;
  &lt;li&gt;I act with &lt;strong&gt;integrity&lt;/strong&gt;. Every word coming out of my mouth is a promise and a commitment that you can hold me accountable for. If I fail to deliver on my commitment, I will openly acknowledge it.&lt;/li&gt;
  &lt;li&gt;I provide full &lt;strong&gt;transparency&lt;/strong&gt; around circumstances, plans and decisions as well as organisation’s expectations of you.&lt;/li&gt;
  &lt;li&gt;I learn about &lt;strong&gt;your career goals and aspirations&lt;/strong&gt; and will help you grow and realise them.&lt;/li&gt;
  &lt;li&gt;I &lt;strong&gt;collaborate&lt;/strong&gt; with you to create an environment that is conducive of excellent outcomes and I will recognise and reward &lt;strong&gt;excellence&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And team leads share this pledge.&lt;/p&gt;

&lt;p&gt;Any questions?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My expectations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;You &lt;strong&gt;respect&lt;/strong&gt; everyone.&lt;/li&gt;
  &lt;li&gt;You act with &lt;strong&gt;integrity&lt;/strong&gt;: you do what you say you do and I will hold you accountable for it.&lt;/li&gt;
  &lt;li&gt;You provide full &lt;strong&gt;transparency&lt;/strong&gt;: you are accountable for your actions and own and communicate the results.&lt;/li&gt;
  &lt;li&gt;You have high level of &lt;strong&gt;sustainable productivity and quality&lt;/strong&gt;. This is not a place for mediocrity. To be part of a world class team, you have to show world class performance.&lt;/li&gt;
  &lt;li&gt;You value &lt;strong&gt;collaboration&lt;/strong&gt; over individual goals. It doesn’t matter how good you are if you are not willing to collaborate. High performing individuals are great. What’s greater is high performing teams and what’s even greater is a high performing company.&lt;/li&gt;
  &lt;li&gt;We only &lt;strong&gt;make new mistakes&lt;/strong&gt;. We forgive any mistake the first time around, but we also immediately learn about and address the root cause so it won’t happen again.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And team leads share these expectations.&lt;/p&gt;

&lt;p&gt;Any questions?&lt;/p&gt;

&lt;p&gt;Please think about these in the next few days. It’s ok if you don’t agree with these; but you need to raise and discuss it with me. So if you have any questions, comments, concerns or objections, please come to me and let’s discuss them in person. If I don’t hear anything from you by the end of week, I will take that as a commitment from you.&lt;/p&gt;

&lt;p&gt;I then documented this on the company wiki and sent an email to everyone thanking them for their time and sharing the pledge link with them. We held another meeting the week after to discuss any questions or concerns.&lt;/p&gt;

&lt;h3 id=&quot;key-takeaways&quot;&gt;Key Takeaways&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Think about what you stand for and expect before communicating it to anyone. I thought about my values for over a week and while a lot of things came to mind, I decided to keep the list very short so it’s easy to remember.&lt;/li&gt;
  &lt;li&gt;Think about the end goal and communicate that as well. I set a mission for myself, &lt;em&gt;to build a world class software team that defies any challenge and creates products that customers love&lt;/em&gt;, and I communicated that with everyone, so you are all aligned and headed towards the same end goal.&lt;/li&gt;
  &lt;li&gt;Get buy-in from the CEO (or your immediate manager) and the rest of the leadership team before communicating this widely. It doesn’t matter what you stand for if you values are not aligned with the CEO’s. Likewise, if you don’t work with everyone directly, it’s critical that other leaders share these values and expectations; otherwise you could fail to deliver on your pledge or engender your expectations because a leader is misaligned.&lt;/li&gt;
  &lt;li&gt;Communicate your values and expectations early and clearly &lt;a href=&quot;http://www.mckinsey.com/global-themes/leadership/why-effective-leaders-must-manage-up-down-and-sideways&quot;&gt;up, down and sideways&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Last but not least, you can’t be selective about when to deliver on your promises and stand for your expectation. &lt;strong&gt;Communicating values you can’t live up to and stand for consistently is much worse than not communicating them at all&lt;/strong&gt;. I have pledged that &lt;em&gt;“every word coming out of my mouth is a promise and a commitment”&lt;/em&gt;, and that applies to my pledge and expectations. This is not always easy and could be quite painful at times; but I strongly believe that nothing works without integrity.&lt;/p&gt;
</description>
        <pubDate>Thu, 29 Jun 2017 00:00:00 +0000</pubDate>
        <link>https://www.mehdi-khalili.com/be-clear-and-explicit-about-your-values-and-expectations</link>
        <guid isPermaLink="true">https://www.mehdi-khalili.com/be-clear-and-explicit-about-your-values-and-expectations</guid>
        
        <category>Leadership</category>
        
        
      </item>
    
      <item>
        <title>The ultimate software QA process</title>
        <description>&lt;p&gt;I have worked with many teams and organisations with varying approaches to testing and QA. In this post I cover some of the approaches I’ve come across and their pros and cons, and will then present my ideal software quality process.&lt;/p&gt;

&lt;h3 id=&quot;all-the-qas&quot;&gt;ALL the QAs&lt;/h3&gt;
&lt;p&gt;On the one extreme side of QA heaviness spectrum, I’ve worked with a few teams with many layers of manual testers. In one team, there were no automated tests whatsoever. When developers were done with a task, the BA would pick up the task and test it on the dev environment. If the BA was happy with it, the task would move forward in the testing pipeline where it was later tested by a QA team. If the QAs were happy with it, it would then move to the next and last stage where yet another group of QAs, called acceptance testers, would test the change again but in a broader context to make sure it hasn’t caused any regression elsewhere. The testing process in this team took somewhere between one to six months depending on the size and criticality of the change as well as the testing pipeline which was always full. If I recall correctly, this team had 47 staff: there were eight developers, six BAs and the rest were testers!!&lt;/p&gt;

&lt;p&gt;In another team, there were some automated tests as well as three manual testers per developer and even then the manual testing cycle took as long as development. I was invited to this organisation to help them improve their processes. When I asked why they had so many testers, they said their application is life critical and a bug could cost someone’s life. When I looked at their testing pipeline, there were several critical bugs sitting there waiting to be tested and released. When I asked them why they don’t release the bug fixes, they said they couldn’t release them before they are thoroughly tested and that took weeks. Oh the irony!!&lt;/p&gt;

&lt;h4 id=&quot;qa-as-the-quality-gatekeeper&quot;&gt;QA as the quality gatekeeper&lt;/h4&gt;
&lt;p&gt;When you rely very heavily on QAs for the quality of your software, you end up adding more and more QAs as the size and complexity of your app grow, and even then your release cycle gets slower over time.&lt;/p&gt;

&lt;p&gt;The other side effect of this process is that developers become more and more insensitive towards software quality because “&lt;em&gt;it’s someone else’s problem&lt;/em&gt;”. This then leads into bad blood between QAs and developers: QAs become increasingly unhappy as developers don’t care about quality as much as they should and QAs find a lot of silly bugs on every card. Developers also become increasingly unhappy at work as they keep getting pulled back to fix bugs on tasks they considered done.&lt;/p&gt;

&lt;p&gt;You might think “&lt;em&gt;but good devs don’t behave this way&lt;/em&gt;”. I have seen many good devs become lazy and insensitive towards quality when someone else is responsible for it.&lt;/p&gt;

&lt;p&gt;This buck passing mindset is what brings the application delivery cycle to a halt. When you hold your QAs responsible for the quality of application, they make damn sure that no bug can get through. So they test the application as thoroughly as humanly possible, and when that takes a long time and business wants features out more quickly, you hire more QAs. This is a slippery slope.&lt;/p&gt;

&lt;h3 id=&quot;no-qas&quot;&gt;No QAs!&lt;/h3&gt;
&lt;p&gt;On the other extreme end of this spectrum, I’ve worked with teams without any official QA role. In these teams, in absence of anyone else to rely on for software quality, the developers write high quality code with good test coverage. They also manually test their own code with the provided acceptance criteria, and they do some manual testing for edge cases, security, accessibility, UX etc. Typically the change is made, reviewed and tested by different developers to ensure it’s looked at by as many people as possible.&lt;/p&gt;

&lt;p&gt;When you don’t rely on QAs for software quality, the application can be released to production more frequently, because there is no back and forth between developers and QAs and there is no separate testing pipeline. In the teams I mentioned above, there were multiple releases to production everyday: basically if the developers were happy with a change and the CI pipeline was happy with the build and tests, the code would be released to production. More often than not, the release is configured to happen automatically at the end of a successful test run. So the speed of value delivery is significantly higher. Another perhaps intangible effect of this process is that developers are really happy at work because they feel ownership over the quality of application, get to deliver value to customers at a rapid pace and aren’t bogged down by “unnecessary red tape”.&lt;/p&gt;

&lt;p&gt;Some people get concerned that this results into some bugs getting released to production, and they are partially right, as I discuss below. That said, since you can release more frequently, the bugs can be dealt with very rapidly. A bug is found or reported? You write a failing test to prove the existence of bug, you fix the code, and go through the same process as above, and the bug fix is pushed to production an hour or two after the bug is found.&lt;/p&gt;

&lt;h4 id=&quot;you-still-need-qas&quot;&gt;You still need QAs&lt;/h4&gt;
&lt;p&gt;Having devs as quality gatekeepers is not all rosy though. When it comes to software quality, QAs are a lot more detailed, thorough and picky than developers. As a QA, you have a different mindset. You look at the app through a different lens. Your job is basically to crash the application or make it misbehave. Developers are good in creating applications, QAs are good in breaking them.&lt;/p&gt;

&lt;p&gt;Also why get developers who are good at creating and enjoy doing it do something they’re not very good at and don’t necessarily enjoy doing? Having QAs in your team means better quality outcome. Also since your developers spend less time on manual testing, they will have more time for coding and you can get more features out.&lt;/p&gt;

&lt;h3 id=&quot;the-ultimate-software-qa-process&quot;&gt;The ultimate software QA process&lt;/h3&gt;
&lt;p&gt;You should have QAs in your team. Your milage might vary but I think this works very well with one QA per 5 to 8 developers depending on several factors (e.g. how good the devs are, how good the QAs are, how much test coverage you have, the maintainability of your codebase etc). Your QAs are not in a different team. They are PART of the team. Your QAs work closely with BAs to define the story and acceptance criteria before it’s picked by developers. They attend the story kick off with BAs and developers to highlight and discuss corner cases, gotchas and pitfalls. As developers work through the stories, they pair with them to refine the acceptance criteria and help define acceptance tests, help write automated tests, test the feature as it’s being coded, answer questions along with BAs and basically work on the story alongside the rest of the team. This way, by the time the story is done, it should be properly tested as well and there should be no surprises for anyone. So the story is not dev done. It is &lt;a href=&quot;/definition-of-done-in-an-mvc-project&quot;&gt;DONE&lt;/a&gt; and it could go to production if it passes the peer review and the build. But the work of QA is not done yet.&lt;/p&gt;

&lt;h4 id=&quot;exploratory-testing&quot;&gt;Exploratory testing&lt;/h4&gt;
&lt;p&gt;In absence of test automation, most QAs come up with large body of test cases and run through them manually. QAs should not follow test scripts. Computers are really good and fast at following scripts. Humans are too smart and valuable for that. If your QAs follow a test script, automate it. That will run significantly faster, can even run overnight and since computers don’t get tired or distracted, it is not prone to human error!! This will also free up your QAs to do what humans are good at: creative work.&lt;/p&gt;

&lt;p&gt;I have found QAs to be very effective in exploratory testing. That’s when they do their best to break the system; but we just said the code is pushed to production if it passes tests! In this model, there is no place for a test environment, because it unnecessarily slows down deployment to production. That leaves QAs with one place to test the application: in production! After the code is released to production, QAs will test the feature and application in production. You can never ensure the quality of an application better than testing it in production when it’s run on the production hardware, configuration, setup etc. And BTW this applies to performance and load testing too!&lt;/p&gt;

&lt;h4 id=&quot;change-gradually&quot;&gt;Change gradually&lt;/h4&gt;
&lt;p&gt;This sounds like a scary concept and admittedly takes a lot of discipline and practice to master; but I’ve done it in a few teams and nothing feels as good or effective in comparison. I appreciate it is difficult to go from a traditional QA heavy mindset to what seems like a cowboy style software delivery. There are different things you can do to bridge this gap and build the trust. For example you can use something like &lt;a href=&quot;https://guides.github.com/introduction/flow/&quot;&gt;GitHub Flow&lt;/a&gt; where you deploy branches to production. That way if you find a bug in production, you can just push the master back up again. Obviously there are considerations around database migration if you have relational databases; e.g. your database migrations should be backwards compatible so the old version of application can still work with the performed database changes; otherwise pushing master to production could break the application or cause data loss (if you roll your database back as the result).&lt;/p&gt;

&lt;p&gt;Also don’t forgo your test or staging environment instantly. You can use them while you’re building up and getting used to this process. Keep the test environment and run your manual regression testing on them as a stage before pushing the code to production. Every bug you find will obviously reduce your trust for full continuous delivery model promised above. That means you either don’t have good test coverage or good tests, or your devs are not disciplined enough, or your QAs are not properly involved during the development of stories. You need to chip away at these issues gradually. As you get better at it and the number of bugs you find during this stage gets closer to zero, you build up trust in the process and at some point you will be able to comfortably drop the manual testing stage altogether.&lt;/p&gt;

&lt;h4 id=&quot;you-might-need-a-manual-test-stage-for-some-changes&quot;&gt;You might need a manual test stage for some changes&lt;/h4&gt;
&lt;p&gt;Some changes are too big, complex or otherwise difficult to make in a backwards compatible way. It’s not that you can’t do it; but it might cost significantly more if you did it that way. You would want to test these changes manually to avoid any critical bugs slipping through or bringing production down on release. This can happen by pushing the code in a feature branch and push that branch to a test environment for manual testing (similar to how GitHub flow works). You can then either merge that back to trunk and push to prod, or just push to production from the branch and only merge to master after a successful release.&lt;/p&gt;

&lt;h4 id=&quot;feature-toggles&quot;&gt;Feature Toggles&lt;/h4&gt;
&lt;p&gt;I see &lt;a href=&quot;https://martinfowler.com/articles/feature-toggles.html&quot;&gt;feature toggles&lt;/a&gt; as an essential ingredient for continuous delivery. If your changes are wrapped in a feature toggle, then they can be deployed to production with less worry. QAs could then login to production, toggle the feature on for themselves, test the system with the feature toggled on, and only toggle the feature on globally (AKA release it) when they are happy with its quality.&lt;/p&gt;

&lt;p&gt;You can also automate the feature toggle roll out. You basically start with the feature completely toggled off. When the QA is happy with the feature, they trigger an event in the system that will automatically roll out the feature to a small test group. After the rollout, the test group’s error count, conversion rate, memory usage patterns, CPU usage patterns etc is automatically compared with a control group. If the outcome is desirable, the system rolls the feature out to more users and continues with the same process until the feature is rolled out to all users. If the test group shows any spikes in the number of errors or any other important indicator, then the system automatically toggles the feature off. In one project, we went as far as identifying the PR that led to run time regression and raised a ticket with data collected from the experiment and assigned it to the team as a high priority. This is a very interesting approach; but I’m going to park this here as it’s not the focus of this article.&lt;/p&gt;

&lt;h3 id=&quot;the-ultimate-software-delivery-process&quot;&gt;The ultimate software delivery process&lt;/h3&gt;
&lt;p&gt;Let’s zoom out and look at the entire software delivery process. The ultimate software delivery process is the one that allows for rapid and continuous development and delivery of high quality features to customers.&lt;/p&gt;

&lt;p&gt;This idea of QAs working along the team is not a new concept. It is just an extension of the DevOps movement. DevOps was created out of the frustration caused by the functional silos between dev and ops teams. Dev would throw their application over the wall to Ops team for them to deploy, monitor and operate it in production. That led to miscommunication, issues in production, slow releases, politics and heavy change management processes to name a few. Devs throwing the application over the wall to QA team is no different. You still end up with functional silos which result in more or less the same amount of pain, slowness and politics.&lt;/p&gt;

&lt;p&gt;Now let’s expand this idea to every role in your team. If BAs analyse the requirements, fully specify what needs to happen and throw it over the wall to devs, then devs become code monkeys and just implement what’s written on the card. Instead you want discussion between BAs and devs. Devs should discuss the stories in detail with BAs, challenge things that may not work well and work with BAs to define the work in a way that makes sense, not just from the business’ point of view but also from the technical one. Likewise, you don’t want your UX designers to design interfaces, workflows and interactions without consultation with the rest of the team or your Product Manager(s) to come up with a roadmap in isolation.&lt;/p&gt;

&lt;p&gt;Everyone is in this together and this is why cross functional teams work so well. The smoothest software development process is one achieved through heavy collaboration on every aspect of work, from analysis to design to development to testing and deployment. The days of waterfall software development where these tasks were performed sequentially and by different groups of people are long gone. A software development team should now be a self contained team composed of every role required to go from an idea to a running feature in production.&lt;/p&gt;

&lt;p&gt;I would love to hear your thoughts if you have had success with other processes and approaches.&lt;/p&gt;
</description>
        <pubDate>Thu, 30 Mar 2017 00:00:00 +0000</pubDate>
        <link>https://www.mehdi-khalili.com/the-ultimate-software-qa-process</link>
        <guid isPermaLink="true">https://www.mehdi-khalili.com/the-ultimate-software-qa-process</guid>
        
        <category>Notes</category>
        
        
      </item>
    
      <item>
        <title>Microservices lessons from trenches - DDD Melbourne</title>
        <description>&lt;p&gt;You can find the screen recording and the slides from my DDD Melbourne talk titled ‘Microservices lessons from trenches’ here:&lt;/p&gt;

&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/3JtKks8YuCAmPf&quot; width=&quot;425&quot; height=&quot;355&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen=&quot;&quot;&gt; &lt;/iframe&gt;
&lt;div style=&quot;margin-bottom:5px&quot;&gt; &lt;strong&gt; &lt;a href=&quot;//www.slideshare.net/MehdiKhalili/microservices-lessons-from-trenches&quot; title=&quot;Microservices lessons from trenches&quot; target=&quot;_blank&quot;&gt;Microservices lessons from trenches&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;//www.slideshare.net/MehdiKhalili&quot; target=&quot;_blank&quot;&gt;Mehdi Khalili&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;

&lt;iframe width=&quot;420&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/q_3lXwyTgpY&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
</description>
        <pubDate>Fri, 07 Aug 2015 00:00:00 +0000</pubDate>
        <link>https://www.mehdi-khalili.com/presentations/microservices-lessons-dddmel</link>
        <guid isPermaLink="true">https://www.mehdi-khalili.com/presentations/microservices-lessons-dddmel</guid>
        
        <category>Microservices</category>
        
        <category>Architecture</category>
        
        <category>Presentations</category>
        
        
      </item>
    
      <item>
        <title>Microservices lessons from trenches</title>
        <description>&lt;p&gt;There has been a bit of hype lately around microservices. You go to conferences and read blogs and all you hear is how awesome microservices architecture is. Some of the main (perceived) benefits of microservices are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Scalability: unlike monolithic apps, you can scale the services that actually need to scale instead of the whole app.&lt;/li&gt;
  &lt;li&gt;Loose coupling: loosely coupled services can be versioned (or rewritten from the ground up) independently without impacting the rest of the system.&lt;/li&gt;
  &lt;li&gt;Fault tolerance: due to loose coupling, isolated processes and hosting, faults in one service doesn’t impact the rest of the system.&lt;/li&gt;
  &lt;li&gt;Scalable development: you can’t throw 50 developers on one codebase as that would lead to a lot of merge conflicts; but you could throw 50 developers at 10 repositories without any problems.&lt;/li&gt;
  &lt;li&gt;Lower cognitive load: instead of having 1 million lines of entangled code in one repository, each service has its own repository which is a lot lighter. That means you can wrap your head around a service end to end a lot simpler.&lt;/li&gt;
  &lt;li&gt;Technical diversification: since you have different codebase and data storage for each service, you can use the best tool for the job in each service: use relational DB for one service and graph DB for another, use Node for one service and Java for another etc.&lt;/li&gt;
  &lt;li&gt;Autonomous teams: each service typically has a service team that owns it, from perception and design all the way to implementation, deployment and monitoring. Ideally a service team has complete autonomy over the service: they get to pick the technology they want to use and implement the way it makes sense to them, as opposed to having to follow a single coding standard and tech stack which is typical of monolithic applications.&lt;/li&gt;
  &lt;li&gt;Continuous delivery: it’s a lot simpler to do continuous delivery of smaller independent services and components than to continuously release an entire application all at once. Loose coupling and fault tolerance also make it easier to deploy frequently without impacting the entire system.&lt;/li&gt;
  &lt;li&gt;Evolutionary design: smaller services are easier to create, change and evolve and that facilitates experimentation. Create a service to validate an idea. If it flies, keep it and evolve it, and if not, kill it. To do this effectively you will need deployment and infrastructure automation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I purposely didn’t go into details of these benefits because they’ve been written and talked about many times. If you’re interested you can learn more about microservices and their benefits and challenges &lt;a href=&quot;http://martinfowler.com/microservices/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I love microservices and distributed systems and that’s my main expertise - what I don’t like is the hype. Developers are very passionate about what they do. We hear or see something awesome and suddenly HAVE to do it, not because it fits our needs but because we like to try it. So in this series of posts I would like to talk more about some of the challenges of microservices.&lt;/p&gt;

&lt;p&gt;Here is an (evolving) index of posts I am considering to write over time:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Culture&lt;/li&gt;
  &lt;li&gt;Fault tolerance&lt;/li&gt;
  &lt;li&gt;Loose coupling&lt;/li&gt;
  &lt;li&gt;Greenfield microservices&lt;/li&gt;
  &lt;li&gt;Service size and boundaries&lt;/li&gt;
  &lt;li&gt;Continuous delivery&lt;/li&gt;
  &lt;li&gt;Decentralized data management&lt;/li&gt;
  &lt;li&gt;REST or messaging?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope that by highlighting some of these challenges, you weigh the challenges and cost of microservices against its benefits before you pick it for your next project.&lt;/p&gt;

&lt;p&gt;Stay tuned!&lt;/p&gt;
</description>
        <pubDate>Wed, 05 Aug 2015 00:00:00 +0000</pubDate>
        <link>https://www.mehdi-khalili.com/microservices-lessons</link>
        <guid isPermaLink="true">https://www.mehdi-khalili.com/microservices-lessons</guid>
        
        <category>Microservices</category>
        
        <category>Architecture</category>
        
        
      </item>
    
      <item>
        <title>BDDfy V4</title>
        <description>&lt;p&gt;After &lt;a href=&quot;https://github.com/TestStack/TestStack.BDDfy/compare/v3.19.1...v4.0.0&quot;&gt;4 months of hard work, 30 pull requests and 300 commits&lt;/a&gt; &lt;a href=&quot;https://github.com/TestStack/TestStack.BDDfy/blob/master/release-notes.md#v400---2014-07-27&quot;&gt;BDDfy V4&lt;/a&gt; is now released with a lot of cool new features. The &lt;a href=&quot;http://teststack.net/&quot;&gt;TestStack&lt;/a&gt; team is super excited about this release and we hope you will be excited to see the new features too.&lt;/p&gt;

&lt;h2 id=&quot;examples&quot;&gt;Examples&lt;/h2&gt;
&lt;p&gt;BDDfy now supports Cucumber-like examples on both Fluent and Reflective APIs.&lt;/p&gt;

&lt;p&gt;This is how you can use examples in the fluent API (all of the samples are using NUnit and are available from the TestStack.BDDfy.Samples NuGet package):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;public class RunExamplesWithReflectiveApi
{
    public int Start { get; set; }
    public int Eat { get; set; }
    public int Left { get; set; }

    [Test]
    public void CanRunExamplesWithReflectiveApi()
    {
        this.Given(&quot;Given I have &amp;lt;start&amp;gt; cucumbers&quot;)
                .And(_ =&amp;gt; _.AndIStealTwoMore())
            .When(_ =&amp;gt; _.WhenIEat__eat__Cucumbers())
            .Then(_ =&amp;gt; _.ThenIShouldHave__left__Cucumbers())
            .WithExamples(new ExampleTable(&quot;Start&quot;, &quot;Eat&quot;, &quot;Left&quot;)
            {
                {12, 5, 9},
                {20, 5, 17}
            })
            .BDDfy();
    }

    // I didn't have to create this method
    // because all it was going to do was to set Start property
    // which is being handled by the framework
    // And the step title is provided inline
    //private void GivenIHave__start__Cucumbers()
    //{
    //}

    private void AndIStealTwoMore()
    {
        Start += 2;
    }

    private void WhenIEat__eat__Cucumbers()
    {
        // This method is called after the Eat property is set by the framework
        // I didn't have to put this here, like the Given method, but I put it here to show that
        // you can take additional actions here if you want
    }

    private void ThenIShouldHave__left__Cucumbers()
    {
        Assert.That(Start - Eat, Is.EqualTo(Left));
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here is the generated console report:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/get/bddfy-v4/examples-console.PNG&quot; alt=&quot;Example Console Report&quot; /&gt;&lt;/p&gt;

&lt;p&gt;and the HTML report:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/get/bddfy-v4/examples-html.PNG&quot; alt=&quot;Example HTML Report&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You could also write examples in the reflective API:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;public class UseExamplesWithReflectiveApi
{
    private int _start;
    private int _eat;

    [Test]
    public void CanRunExamplesWithReflectiveApi()
    {
        this.WithExamples(new ExampleTable(&quot;Start&quot;, &quot;Eat&quot;, &quot;Left&quot;)
            {
                {12, 5, 7},
                {20, 5, 15}
            })
            .BDDfy();
    }

    void GivenThereAre__start__Cucumbers(int start)
    {
        // the start argument is provided by the framework based on the example entries
        // please note that `start` argument name matches the `start` header from the examples
        // and also it has to match with the &amp;lt;start&amp;gt; placeholder in the step title which is created based on conventions
        _start = start;
    }

    // I can still override the step type using the `Executable` attributes
    [AndGiven(&quot;And I eat &amp;lt;eat&amp;gt; of them&quot;)]
    void WhenIEatAFewCucumbers(int eat)
    {
        // the eat argument is provided by the framework based on the example entries
        // please note that `eat` argument name matches the `start` header from the examples
        // and also it has to match the &amp;lt;eat&amp;gt; placeholder in the step title
        _eat = eat;
    }

    void ThenIShouldHave__left__Cucumbers(int left)
    {
        // like given and when steps left is provided here because it matches the example header and is found on the step title
        Assert.That(_start - _eat, Is.EqualTo(left));
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For more information on the example support refer to &lt;a href=&quot;http://jake.ginnivan.net/blog/2014/05/06/bddfy-examples-support/&quot;&gt;this post&lt;/a&gt; by Jake Ginnivan. We would not have examples support without his huge contribution.&lt;/p&gt;

&lt;h2 id=&quot;improvements-on-story&quot;&gt;Improvements on Story&lt;/h2&gt;
&lt;p&gt;Before V4 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Story&lt;/code&gt; was relatively rigid. We had one &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Story&lt;/code&gt; attribute with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;As a, I want, so that&lt;/code&gt; syntax and it would show up with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Story&lt;/code&gt; prefix in the reports. These limitations have now been lifted.&lt;/p&gt;

&lt;h3 id=&quot;storynarrative&quot;&gt;StoryNarrative&lt;/h3&gt;
&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Story&lt;/code&gt; is now a subclass of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StoryNarrative&lt;/code&gt; class:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;public class StoryNarrativeAttribute : Attribute
{
    public string Title { get; set; }
    public string TitlePrefix { get; set; }
    public string Narrative1 { get; set; }
    public string Narrative2 { get; set; }
    public string Narrative3 { get; set; }

    // rest of class removed for brevity
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;There are a few things of note:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;There is a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TitlePrefix&lt;/code&gt; property that allows you to specify what prefix should be used for “stories” in the reports. For example if you prefer the word &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Specification&lt;/code&gt; over &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Story&lt;/code&gt; you can create a new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SpecificationAttribute&lt;/code&gt; that subclasses &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StoryNarrative&lt;/code&gt; attribute where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TitlePrefix&lt;/code&gt; is set to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Specification&lt;/code&gt; (or you could provide your desired prefix for each story if you wanted to).&lt;/li&gt;
  &lt;li&gt;StoryNarrative doesn’t make any assumptions around story narrative format. It only knows there could be up to three lines in the story narrative. So you could create your custom attribute to tell the story in a different way if you want; e.g.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;
public class InOrderToStoryAttribute : StoryNarrativeAttribute
{
	public string InOrderTo
	{
	    get { return Narrative1; }
	    set { Narrative1 = value; }
	}

	public string AsA
	{
	    get { return Narrative2; }
	    set { Narrative2 = value; }
	}

	public string IWant
	{
	    get { return Narrative3; }
	    set { Narrative3 = value; }
	}
}
&lt;/pre&gt;

&lt;p&gt;And use it instead of the built-in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Story&lt;/code&gt; attribute:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[InOrderToStory(
    InOrderTo = &quot;In order to do BDD properly&quot;,
    AsA = &quot;As a great programmer&quot;,
    IWant = &quot;I want to use BDDfy&quot;)]
public class GreatProgrammersUseBddfy
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This attribute is not part of BDDfy core at the moment. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;In order to&lt;/code&gt; syntax has gained a fair bit of traction in the BDD community and we would like to have it in the core but the name, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;InOrderToStoryAttribute&lt;/code&gt;, is a bit awkward. We could alternatively add the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;InOrderTo&lt;/code&gt; property to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Story&lt;/code&gt; attribute. We need your feedback on this.&lt;/p&gt;

&lt;p&gt;Also &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StoryMetadata&lt;/code&gt; class now only relies on narrative lines; so you can completely skip over &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StoryNarrative&lt;/code&gt; attribute and inject the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StoryMetadata&lt;/code&gt; directly based on some completely different means. You might find more information around this extension point &lt;a href=&quot;http://www.michael-whelan.net/roll-your-own-testing-framework/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;narrative-convention&quot;&gt;Narrative convention&lt;/h3&gt;
&lt;p&gt;Starting V4 you can leave out the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;As a&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;I want&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;So that&lt;/code&gt; from your story narratives. So instead of:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[Story(
    AsA = &quot;As a great programmer&quot;,
    IWant = &quot;I want to use BDDfy&quot;,
    SoThat =  &quot;So that I can do BDD properly&quot;)]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;you can now use&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[Story(
    AsA = &quot;great programmer&quot;,
    IWant = &quot;to use BDDfy&quot;,
    SoThat =  &quot;I can do BDD properly&quot;)]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And BDDfy will inject the missing text for you. This is backward compatible and only injects the text if it’s missing.&lt;/p&gt;

&lt;p&gt;We have applied the same logic to the Fluent API step titles (more on this shortly).&lt;/p&gt;

&lt;h2 id=&quot;complex-flows-in-fluent-api&quot;&gt;Complex flows in Fluent API&lt;/h2&gt;
&lt;p&gt;A couple of years ago I thought complex flows are anti-pattern in BDD and UI testing which is why you couldn’t write a when or given after a then. Well, I was wrong. Now I believe complex flow is a critical part of Acceptance Test Driven Development. So we’ve added support for complex flows in Fluent API. Here is an example:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;this.Given(x =&amp;gt; x.IAmOnHomePage())
	.When(x =&amp;gt; x.ILogin())
	.Then(x =&amp;gt; x.IShouldBeOnTheHomePage())
		.And(x =&amp;gt; x.IShouldBeAuthenticated())
	.When(x =&amp;gt; x.ILogOut())
	.Then(x =&amp;gt; x.IShouldReturnToHomePage())
		.And(x =&amp;gt; x.IShouldNoLongerBeAuthenticated())
	.BDDfy();
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The Fluent API has completely opened up to allow for any combination of steps. This feature is currently missing from the reflective API mostly because applying the order in the reflective API is a bit more complex as it only relies on reflection. Don’t worry though. We have a few ideas for adding that to reflective API and hopefully that’ll surface in the near future.&lt;/p&gt;

&lt;h2 id=&quot;more-goodness-on-fluent-api&quot;&gt;More goodness on Fluent API&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;As mentioned above, step type is now prepended to step title if you don’t specify it. For example &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.Given(() =&amp;gt; Foo())&lt;/code&gt; will report as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Given foo&lt;/code&gt;. This allows for easy code reuse where for example you can use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Foo&lt;/code&gt; as Given and When. This change is backward compatible so your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.Given(() =&amp;gt; GivenFoo())&lt;/code&gt; will still work as before.&lt;/li&gt;
  &lt;li&gt;Fluent API now also supports inline steps which means you can just use an anonymous function inline with the step definition; e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.Given(() =&amp;gt; { // some code in here // }, &quot;Some title&quot;)&lt;/code&gt;. Since BDDfy can’t resolve the step title from the anonymous function, you have to pass the title in as the second argument.&lt;/li&gt;
  &lt;li&gt;We also support title-only steps in Fluent API; e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.When(() =&amp;gt; &quot;something happens&quot;)&lt;/code&gt;. This is quite handy in situations where you don’t want to execute a method but just want to communicate something on the report.&lt;/li&gt;
  &lt;li&gt;We now also support deep method calls on Fluent API so you could write &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.Given(() =&amp;gt; someClass.SomeOtherClass.SomeMethod())&lt;/code&gt;. Another cool little feature in Fluent API is the introduction of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StepTitle&lt;/code&gt; attribute. You could decorate your step methods with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StepTitle&lt;/code&gt; and just call the method from the step definition API and let BDDfy extract the title from the  attribute. This combined with deep method calls allows you to delegate the step title generation to methods on classes defined out of your scenarios. If you are for example using page objects for UI automation, you could put the step title on your page actions! This violates SRP but nevertheless is very cool and it cuts down on the amount of code you have to write in your scenarios.&lt;/li&gt;
  &lt;li&gt;Step arguments are now evaluated lazily in Fluent API so if previous steps cause the value to change, the value at the time of step execution will be reported in the step.&lt;/li&gt;
  &lt;li&gt;Step arguments can now also be method calls. BDDfy will try to execute the method and inject the return value as the step argument; e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.Given(() =&amp;gt; SomethingIsSet(SomeArgument(), AnotherArgument()))&lt;/code&gt;. We also added support for passing local variables as arguments to steps.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;metro-stype-html-report&quot;&gt;Metro-stype HTML report&lt;/h2&gt;
&lt;p&gt;There is now a new metro-style HTML report for metro lovers. This is not active by default and if you want to use it you have to tell BDDfy: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Configurator.BatchProcessors.HtmlMetroReport.Enable();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/get/bddfy-v4/metro-report.PNG&quot; alt=&quot;Metro Report&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Michael has written an extensive post about this &lt;a href=&quot;http://www.michael-whelan.net/customizing-metro-report-in-bddfyv4/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;self-contained-html-reports&quot;&gt;Self-contained HTML reports&lt;/h2&gt;
&lt;p&gt;Both HTML reports are now self contained (this was actually shipped in 3.19). This means you will have one file, instead of 3+ files that you had before, that you can easily share from your artifact repository on your CI server, DropBox or just email around. Your custom JavaScript and CSS files are also embedded in the report to ensure there will be one and only one file in the output.&lt;/p&gt;

&lt;p&gt;“But what about jQuery?”, you ask! We didn’t want to embed jQuery into the report but at the same time wanted to have a self contained HTML report. So we are resolving jQuery from jQuery CDN. We have also added a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ResolveJqueryFromCdn&lt;/code&gt; config point, set to true by default. This allows you to embed jQuery into your report if you need to view the reports without an internet connection.&lt;/p&gt;

&lt;p&gt;Also worth noting that since everything is being embedded into the HTML report we decided to minify the bddfy.css and bddfy.js files to make the HTML report smaller and the HTML source more readable.&lt;/p&gt;

&lt;h2 id=&quot;tags&quot;&gt;Tags&lt;/h2&gt;
&lt;p&gt;You can now add Tags to your scenarios. Here is what our example test in reflective API would look like with tags:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;this.WithExamples(
	new ExampleTable(&quot;Start&quot;, &quot;Eat&quot;, &quot;Left&quot;) {
				    {12     , 5    , 7     },
				    {20     , 5    , 15    }})
    .WithTags(&quot;Tag1&quot;, &quot;Tag2&quot;)
    .BDDfy();
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The tags as reported in the console report:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/get/bddfy-v4/tags-in-console.PNG&quot; alt=&quot;Tags in console report&quot; /&gt;&lt;/p&gt;

&lt;p&gt;and the HTML report:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/get/bddfy-v4/tags-in-html.PNG&quot; alt=&quot;Tags in HTML report&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We will later add filtering based on tags to the HTML reports.&lt;/p&gt;

&lt;h2 id=&quot;but-steps&quot;&gt;But steps&lt;/h2&gt;
&lt;p&gt;For &lt;a href=&quot;https://github.com/cucumber/cucumber/wiki/Given-When-Then#and-but&quot;&gt;full compatibility with Gherkin&lt;/a&gt; we now support &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;But&lt;/code&gt; steps. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;But&lt;/code&gt; steps are more or less like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;And&lt;/code&gt; steps except that they read as, ermmmm, but!&lt;/p&gt;

&lt;p&gt;There is a new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ButAttribute&lt;/code&gt; for those who love &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutableAttributes&lt;/code&gt;, a naming convention for methods starting with But (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ButGiven&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ButWhen&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ButThen&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;But&lt;/code&gt;), and step method overloads in the Fluent API.&lt;/p&gt;

&lt;h2 id=&quot;breaking-changes&quot;&gt;Breaking Changes&lt;/h2&gt;
&lt;p&gt;It wouldn’t be a major edition without some breaking changes and we have a few; but all for very good reasons. So here we go:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Some long namespaces were removed from the framework so the API becomes more discoverable. This is a rather big breaking change particularly for fluent API users; but also relatively easy to fix. You just need to delete the now-removed namespaces from your using statements. Most of the API is now located directly on the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TestStack.BDDfy&lt;/code&gt; root namespace.&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Reporters&lt;/code&gt; namespaces that you would use to configure BDDfy’s reports has been moved to the root namespace too.&lt;/li&gt;
  &lt;li&gt;We have renamed a number of types to more accurately reflect their role and usage:&lt;/li&gt;
  &lt;li&gt;renamed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ExecutionStep&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Step&lt;/code&gt; &amp;amp; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Step&lt;/code&gt;’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StepTitle&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Title&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;renamed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StepExecutionResult&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Result&lt;/code&gt; as it was used for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Scenario&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Story&lt;/code&gt; too.&lt;/li&gt;
  &lt;li&gt;renamed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;StepAction&lt;/code&gt; in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Step&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Action&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;renamed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MetaData&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Metadata&lt;/code&gt; everywhere&lt;/li&gt;
  &lt;li&gt;.Net 3.5 support has been discontinuted in V4. So if you want to feel all the love that’s coming to V4 you will need to upgrade to .Net 4+.&lt;/li&gt;
  &lt;li&gt;Strong naming has been removed. Please don’t leave me any comments around your need for strong naming. Stop strong naming your assemblies. Who would strong name a test assembly (apart from the organization for whom I created BDDfy in the beginning)?! It is a &lt;a href=&quot;http://strongnamingconsideredharmful.com/&quot;&gt;bad idea&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Story.Category&lt;/code&gt; has been removed in favour of scenario &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Tags&lt;/code&gt;. This shouldn’t impact anyone as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Category&lt;/code&gt; was never fully implemented.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;update-to-v4&quot;&gt;Update to V4&lt;/h2&gt;
&lt;p&gt;V4 has a lot of goodness in it and we are very excited about it. This is the best thing that’s happened to BDD in .Net since BDDfy itself :) Go and update your BDDfy package to V4 and enjoy the new features.&lt;/p&gt;
</description>
        <pubDate>Sun, 27 Jul 2014 00:00:00 +0000</pubDate>
        <link>https://www.mehdi-khalili.com/bddfy-v4</link>
        <guid isPermaLink="true">https://www.mehdi-khalili.com/bddfy-v4</guid>
        
        <category>BDDfy</category>
        
        <category>OSS</category>
        
        
      </item>
    
      <item>
        <title>Microsoft MVP Award</title>
        <description>&lt;p&gt;I am proud to announce that a couple of weeks ago I received my first Microsoft MVP Award! This award is based on my open source contribution. So I would like to thank those who nominated me and my open source work, folks at Microsoft who pushed for OSS nomination, and last but not least the great community behind my open source projects.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.hanselman.com/blog/OpenSourceIsAThanklessJobWeDoItAnyway.aspx&quot;&gt;Open source is a rather thankless job&lt;/a&gt;. A lot of effort is put into creating, maintaining and promoting an open source project. If you use an OSS project, consider contributing something back. It could be documentation, logo, automation scripts, bug fixes or new features. While you’re at it, you could also &lt;a href=&quot;http://mvp.microsoft.com/en-us/nominate-an-mvp.aspx&quot;&gt;nominate the authors&lt;/a&gt; for MVP Award. It is a nice way to thank them for their efforts.&lt;/p&gt;

&lt;p&gt;Once again, thanks all! This is quite exciting for me :)&lt;/p&gt;
</description>
        <pubDate>Sun, 20 Jul 2014 00:00:00 +0000</pubDate>
        <link>https://www.mehdi-khalili.com/aspnet-mvp-award-2014</link>
        <guid isPermaLink="true">https://www.mehdi-khalili.com/aspnet-mvp-award-2014</guid>
        
        <category>Notes</category>
        
        <category>Personal</category>
        
        
      </item>
    
  </channel>
</rss>
