<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://danibishop.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://danibishop.com/" rel="alternate" type="text/html" /><updated>2025-03-05T17:39:18+00:00</updated><id>https://danibishop.com/feed.xml</id><title type="html">Dani Ramírez</title><subtitle></subtitle><author><name>Dani Ramírez</name></author><entry><title type="html">What Luke Skywalker thinks about your project</title><link href="https://danibishop.com/basics,/agile,/dev-experience/2024/10/24/en-all-you-said-is-wrong-part-I-copy.html" rel="alternate" type="text/html" title="What Luke Skywalker thinks about your project" /><published>2024-10-24T00:00:00+00:00</published><updated>2024-10-24T00:00:00+00:00</updated><id>https://danibishop.com/basics,/agile,/dev-experience/2024/10/24/en-all-you-said-is-wrong-part-I%20copy</id><content type="html" xml:base="https://danibishop.com/basics,/agile,/dev-experience/2024/10/24/en-all-you-said-is-wrong-part-I-copy.html"><![CDATA[<blockquote>
  <p><em>Amazing. Every word of what you just said was wrong. The Rebellion is reborn today. The war is just beginning. And I will not be the last Jedi.</em> - Luke Skywalker</p>
</blockquote>

<p>I am sure that most of you reading here can give this description when asked about “how do you organize your development process”:</p>

<p><em>Well, we do Scrum because we are Agile. We estimate the most important stories to know how much work can be done during the sprint. Then we start developing. Each developer takes a story and creates a branch on top of the development branch. When the task is done, the developer creates a pull request and the code is reviewed by the team. If everything is ok, the code is merged into the development branch. When the development branch is ready, we merge it into the master branch and deploy it to production.</em></p>

<h2 id="first-mistake-we-do-scrum-because-we-are-agile">First mistake: “We do Scrum because we are Agile”</h2>

<p>Scrum is not Agile. Agile is <a href="https://agilemanifesto.org/">Agile</a>. Scrum is a wrapper to make XP (extreme programming) <a href="https://beny23.github.io/posts/my_take_on_engineering_room_9/">“more palatable to management”</a></p>

<h2 id="second-mistake--we-estimate-the-most-important-stories-to-know-how-much-work-can-be-done-during-the-sprint">Second mistake : “We estimate the most important stories to know how much work can be done during the sprint”</h2>

<p>Importance comes from value. Priority should come from cross-matching value and effort. Max value, min effort: that’s the top priority. As nobody will tell you how many monetary units you will receive from a completed story, estimating the effort is just a waste of time.</p>

<p>Discuss about the most relevant topics regarding your product/service. You need some rough estimation <strong>as a team</strong> to bet on what should be done first, but do not let the estimation be the main driver of your development.</p>

<h2 id="third-mistake-each-developer-takes-a-story">Third mistake: “Each developer takes a story”</h2>

<p>Then you get Bob, who knows about the frontend. Then, Alice, who only knows about the API. And Ron, who nobody knows what he knows about, but he is the only one who knows how to deploy the application for some reason.</p>

<p>Tackle stories as a team from definition to production.</p>

<h2 id="fourth-mistake-doing-gitflow">Fourth mistake: Doing Gitflow</h2>

<p>This is not literal from the explanation but it is “common sense” nowadays in many organizations and teams.</p>

<p>Atlassian itself has stated that <strong>GITFLOW IS OUTDATED</strong>. As they state <a href="https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow">here</a>: <em>“Gitflow is a legacy Git workflow”</em></p>

<p>Stop doing Gitflow and start doing trunk-based development with feature flags or some similar mechanism. Happiness will come to your team.</p>

<blockquote>
  <p>This post is part of a series. <a href="/2024/10/24/en/all-you-said-is-wrong-part-II.html">Read the next part here</a></p>
</blockquote>]]></content><author><name>Dani Ramírez</name></author><category term="basics," /><category term="agile," /><category term="dev-experience" /><category term="mistakes" /><summary type="html"><![CDATA[Amazing. Every word of what you just said was wrong. The Rebellion is reborn today. The war is just beginning. And I will not be the last Jedi. - Luke Skywalker I am sure that most of you reading here can give this description when asked about “how do you organize your development process”: Well, we do Scrum because we are Agile. We estimate the most important stories to know how much work can be done during the sprint. Then we start developing. Each developer takes a story and creates a branch on top of the development branch. When the task is done, the developer creates a pull request and the code is reviewed by the team. If everything is ok, the code is merged into the development branch. When the development branch is ready, we merge it into the master branch and deploy it to production. First mistake: “We do Scrum because we are Agile” Scrum is not Agile. Agile is Agile. Scrum is a wrapper to make XP (extreme programming) “more palatable to management” Second mistake : “We estimate the most important stories to know how much work can be done during the sprint” Importance comes from value. Priority should come from cross-matching value and effort. Max value, min effort: that’s the top priority. As nobody will tell you how many monetary units you will receive from a completed story, estimating the effort is just a waste of time. Discuss about the most relevant topics regarding your product/service. You need some rough estimation as a team to bet on what should be done first, but do not let the estimation be the main driver of your development. Third mistake: “Each developer takes a story” Then you get Bob, who knows about the frontend. Then, Alice, who only knows about the API. And Ron, who nobody knows what he knows about, but he is the only one who knows how to deploy the application for some reason. Tackle stories as a team from definition to production. Fourth mistake: Doing Gitflow This is not literal from the explanation but it is “common sense” nowadays in many organizations and teams. Atlassian itself has stated that GITFLOW IS OUTDATED. As they state here: “Gitflow is a legacy Git workflow” Stop doing Gitflow and start doing trunk-based development with feature flags or some similar mechanism. Happiness will come to your team. This post is part of a series. Read the next part here]]></summary></entry><entry><title type="html">Three wrong uses of ChatGPT for development</title><link href="https://danibishop.com/opinion/lists/2023/03/14/en-three-wrong-uses-of-chatgpt-for-dev.html" rel="alternate" type="text/html" title="Three wrong uses of ChatGPT for development" /><published>2023-03-14T00:00:00+00:00</published><updated>2023-03-14T00:00:00+00:00</updated><id>https://danibishop.com/opinion/lists/2023/03/14/en-three-wrong-uses-of-chatgpt-for-dev</id><content type="html" xml:base="https://danibishop.com/opinion/lists/2023/03/14/en-three-wrong-uses-of-chatgpt-for-dev.html"><![CDATA[<p>Starting 2023, everybody is trying to productize ChatGPT. That is a reality we have to deal with. It is just what it is.</p>

<p>There are thousands of articles about how to use ChatGPT, why it is cool, how astonishing it is. I do not care about that in the context of this post. Even if ChatGPT was the best tool ever to generate text/code, I am listing here three cases where I think it is not a good idea.</p>

<blockquote>
  <p>Disclaimer: my goal is not to point to this or that product and say how bad it is. I am not providing any links to any product, even when I have seen them and tested some of them.</p>
</blockquote>

<h2 id="chatgpt-to-generate-commit-messages">ChatGPT to generate commit messages</h2>

<p>It seems natural: you take the diff between two code commits and infer the commit message from it. It is so straightforward that it must be a good idea. But it is not.</p>

<p>Commit messages are intended to provide a human-readable description of the changes. They are written by humans for humans so the <strong>intention</strong> of the changes is clear.</p>

<p>You cannot know the <strong>intention</strong> of the changes from a diff. The diff is the <strong>how</strong> of the changes, not the <strong>why</strong>.</p>

<p><em>“But Dani, people write terrible commit messages. Let’s use ChatGPT to generate them!”</em> I agree that some people write terrible commit messages. That is a reason to train them; not to let a machine write terrible commit messages.</p>

<p>There are really nice templates for commit messages. There are <a href="https://www.conventionalcommits.org/en/v1.0.0/">conventions</a> and there are tons of articles explaining how to write good commit messages (a nice starting point is <a href="https://cbea.ms/git-commit/">here</a>).</p>

<p><em>“But Dani, some commits need a nice summary of what has been done because they have many changes.”</em> Ok. Am I the only one who clearly sees that the problem here is the commit size, not the commit message?</p>

<h2 id="chatgpt-to-generate-changelogs">ChatGPT to generate changelogs</h2>

<p>This is very similar to the previous case. There are already tools that generate changelogs from the git history. I never liked this idea (well… not “never”, I advocated for it some years ago…) as people tend to use it as a black box and copy/paste the output to whatever changelog database they use. Even worse, some people generate <strong>release notes</strong> this way.</p>

<p>You could argue that, if you put such information in the commits, this process becomes really trivial but I can think of many commit messages that are not related to customer facing changes (i.e. “Refactor to improve readability of X class”, “Fix bug in Y method”, “Add unit tests for Z class to cover R case”).</p>

<p>Again, <strong>changelogs are meant to be read by humans</strong> and should contain information about the <strong>intention</strong> of the changes. You cannot know the intention of the changes from the code.</p>

<p>Imagine generating commit messages from the diff using a machine learning model and using those commit messages to generate a changelog and/or a release note. You would end up with <strong>the ilusion</strong> of having proper documents and would probably have to spend a lot of time fixing them.</p>

<h2 id="chatgpt-to-generate-tests">ChatGPT to generate tests</h2>

<p>This one is my favourite. I recently saw this tool that promotes itself showing some source code and the generated unit tests for it.</p>

<p>Aside from violating TDD principles (you could generate <strong>extra</strong> tests aside from the ones you use to design but no the whole test suite), it violated basic testing principlies such as unit testing private methods and testing implementation details.</p>

<p>Even more: the example they show <strong>does not even run</strong> because it lacks imports. And, if you fix the imports, tests don’t pass.</p>

<p>Could you generate tests properly from the code? I am pretty sure you can if you rely on some static analysis prior to the machine learning model to generate code that looks like tests that pass by executing your code. I mean… I have done it without ML in the past. In fact, I generated test templates with known assertions as I was doing a code generation tool for a specific domain. Those tests were meant to check that developers using the code were using the API correctly.</p>

<p>Is this desirable as a generic tool? I do not think so. This conflicts with proper TDD as it masks the need to make tests first. I am not going to argue here about TDD being the right way to go or not: latest studies say that using TDD along with other techniques is a good predictor of success in average, but you are free to test however you prefer. Just don’t use ChatGPT to generate the tests :)</p>

<p>Do you know <strong>what would be awesome?</strong> A tool that generates code from TDD tests. That I would like to see.</p>]]></content><author><name>Dani Ramírez</name></author><category term="opinion" /><category term="lists" /><category term="chatgpt" /><category term="tools" /><summary type="html"><![CDATA[Starting 2023, everybody is trying to productize ChatGPT. That is a reality we have to deal with. It is just what it is.]]></summary></entry><entry><title type="html">An agile budgeting proposal - Part I</title><link href="https://danibishop.com/agile/business/lean/2022/11/24/en-an-agile-budgeting-proposal-part-I.html" rel="alternate" type="text/html" title="An agile budgeting proposal - Part I" /><published>2022-11-24T00:00:00+00:00</published><updated>2022-11-24T00:00:00+00:00</updated><id>https://danibishop.com/agile/business/lean/2022/11/24/en-an-agile-budgeting-proposal-part-I</id><content type="html" xml:base="https://danibishop.com/agile/business/lean/2022/11/24/en-an-agile-budgeting-proposal-part-I.html"><![CDATA[<blockquote>
  <p>tl;dr: Every project I have seen in outsourcing companies has a budget. But having a classic budget is not agile. It’s a static document that is not updated during the project. This is a draft of one of the potential solutions to this problem.</p>
</blockquote>

<h2 id="how-can-we-translate-agility-into-budgeting">How can we translate agility into budgeting?</h2>

<p>Let’s say you have a nice self-managed team that adapts and delivers value at a fast pace to a costumer of a given service-provider company. You have achieved the Agile nirvana. Haven’t you?</p>

<p>There was some bargaining between the service-provider and the costumer, and a <strong>budget</strong> was agreed upon, along with some broad scope and some high-level requirements to be delivered at a certain <strong>deadline</strong>.</p>

<p>Problems appear when budget seems not to be enough and/or deadline is coming and the customer is not satisfied with the whatever the team has delivered.</p>

<p>Problems also appear then the customer’s context changes so wildly that the original scope is no longer valid at all.</p>

<p>Problems also appear when the team is delivering but the customer feels that something is off. The team is not to blame, but the customer is not satisfied.</p>

<p>Should we keep the project going? Is the customer going to lose 100% of the budget regardless of the outcome? Is the provider going to lose 100% of the expected income plus the opportunity cost of blocking the team for a while?</p>

<p>I will explore here a potential solution to these problems. But first we need to define some constraints.</p>

<h2 id="hypothesis">Hypothesis</h2>

<p>There is a way to fairly balance the spent budget up to a certain point, the savings of the customer and the compensation to the provider <strong>if any party decides to retire from the project</strong> before the deadline.</p>

<p>This proposal brings an equilibrium point between the customer’s and the provider’s interests. None of them will regret this agreement once the project starts in any reasonable scenario.</p>

<h2 id="necessary-conditions">Necessary conditions</h2>

<ul>
  <li>Customer <strong>trusts</strong> the team</li>
  <li>Customer will prefer a viable product over a perfect one if that means:
    <ul>
      <li>The product is delivered before the deadline</li>
      <li>The product is delivered for less money than the maximum budget</li>
    </ul>
  </li>
  <li>Customer assumes that the scope will change as both them and the team learn more about <strong>what adds value</strong> and <strong>what doesn’t</strong></li>
  <li>Provider is commited to educate the customer about the agile process</li>
  <li>Provider tries to minimize waste and maximize value per unit of time</li>
  <li>Provider has a queue of projects to work on and/or values the importance of free earned time</li>
  <li>Customer and provider assume that the context when starting a project <strong>will</strong> change during the execution of it and nobody should be blamed for that nor charged.</li>
</ul>

<h2 id="the-model">The model</h2>

<p>The model is concentrated into a single function that defines the balance between the customer’s and the provider’s interests at any given moment and how money and time are balanced.</p>

<p>I named it the <strong>Agile Budget Split Function</strong>, and it depends on the elapsed time.</p>

<p>This function is defined at company, department or project level. It’s a function that is defined by the company’s culture and the team’s values.</p>

<p>This function must be easy to understand and easy to explain to the customer. It must be easy to explain to the team as well.</p>

<hr />
<p>In the <a href="en-an-agile-budgeting-proposal-part-II">next article</a> I explain the basic theory behind the model and I give a concrete example, using a constant function.</p>]]></content><author><name>Dani Ramírez</name></author><category term="agile" /><category term="business" /><category term="lean" /><category term="business" /><summary type="html"><![CDATA[tl;dr: Every project I have seen in outsourcing companies has a budget. But having a classic budget is not agile. It’s a static document that is not updated during the project. This is a draft of one of the potential solutions to this problem. How can we translate agility into budgeting? Let’s say you have a nice self-managed team that adapts and delivers value at a fast pace to a costumer of a given service-provider company. You have achieved the Agile nirvana. Haven’t you? There was some bargaining between the service-provider and the costumer, and a budget was agreed upon, along with some broad scope and some high-level requirements to be delivered at a certain deadline. Problems appear when budget seems not to be enough and/or deadline is coming and the customer is not satisfied with the whatever the team has delivered. Problems also appear then the customer’s context changes so wildly that the original scope is no longer valid at all. Problems also appear when the team is delivering but the customer feels that something is off. The team is not to blame, but the customer is not satisfied. Should we keep the project going? Is the customer going to lose 100% of the budget regardless of the outcome? Is the provider going to lose 100% of the expected income plus the opportunity cost of blocking the team for a while? I will explore here a potential solution to these problems. But first we need to define some constraints. Hypothesis There is a way to fairly balance the spent budget up to a certain point, the savings of the customer and the compensation to the provider if any party decides to retire from the project before the deadline. This proposal brings an equilibrium point between the customer’s and the provider’s interests. None of them will regret this agreement once the project starts in any reasonable scenario. Necessary conditions Customer trusts the team Customer will prefer a viable product over a perfect one if that means: The product is delivered before the deadline The product is delivered for less money than the maximum budget Customer assumes that the scope will change as both them and the team learn more about what adds value and what doesn’t Provider is commited to educate the customer about the agile process Provider tries to minimize waste and maximize value per unit of time Provider has a queue of projects to work on and/or values the importance of free earned time Customer and provider assume that the context when starting a project will change during the execution of it and nobody should be blamed for that nor charged. The model The model is concentrated into a single function that defines the balance between the customer’s and the provider’s interests at any given moment and how money and time are balanced. I named it the Agile Budget Split Function, and it depends on the elapsed time. This function is defined at company, department or project level. It’s a function that is defined by the company’s culture and the team’s values. This function must be easy to understand and easy to explain to the customer. It must be easy to explain to the team as well. In the next article I explain the basic theory behind the model and I give a concrete example, using a constant function.]]></summary></entry><entry><title type="html">An agile budgeting proposal - Part II</title><link href="https://danibishop.com/agile/business/lean/2022/11/24/en-an-agile-budgeting-proposal-part-II.html" rel="alternate" type="text/html" title="An agile budgeting proposal - Part II" /><published>2022-11-24T00:00:00+00:00</published><updated>2022-11-24T00:00:00+00:00</updated><id>https://danibishop.com/agile/business/lean/2022/11/24/en-an-agile-budgeting-proposal-part-II</id><content type="html" xml:base="https://danibishop.com/agile/business/lean/2022/11/24/en-an-agile-budgeting-proposal-part-II.html"><![CDATA[<blockquote>
  <p>DISCLAIMER: This is a WIP</p>
</blockquote>

<blockquote>
  <p>This is the second part of a series of posts about agile budgeting. The first part can be found <a href="en-an-agile-budgeting-proposal-part-I">here</a>.</p>
</blockquote>

<h2 id="agile-budget-split-function-absft">Agile Budget Split Function \(ABSF(t')\)</h2>

<blockquote>
  <p>As I mentioned in the previous part, <strong>this is the function that condenses all the model</strong>. It’s shape defines the balance between the customer’s and the provider’s interests at any given moment and how money and time are balanced.</p>
</blockquote>

<p><em>Given that:</em></p>

<ul>
  <li>Project has a maximum budget \(B\)</li>
  <li>Project has a maximum duration \(D_B\)</li>
  <li>Elapsed time at a given moment is \(t\).</li>
  <li>Normalized time is \(t'=t/D_B\) with \(t'\in[0,1]\)
    <ul>
      <li>\(t'=0\) means that the project has just started</li>
      <li>\(t'=1\) means that the project has reached the deadline</li>
    </ul>
  </li>
  <li>Remaining budget at a given moment is \(B_R(t')=B-(B/D)·t=B(1-t/D) = B(1-t')\)</li>
</ul>

<p>Then, we can split the remaining budget in two parts if the project stops at a given moment \(t'\):</p>

<ul>
  <li>\(ABSF(t')\in[0,1]\) is the <strong>split factor function</strong>.
    <ul>
      <li>It represents what percentage of the remaining budget is saved by the customer if they retire at a given moment \(t'\).</li>
      <li>\(S_\$(t')  = B_R(t')·ABSF(t')\) are the <strong>economic savings for the customer</strong></li>
      <li>\(C_\$(t') = B_R(t')·(1-ABSF(t'))\) is the <strong>economic compensation for the future blocked time</strong> (opportunity cost)</li>
      <li>So, the remaining budget is the sum of both savings plus compensation: \(B_R(t') = S_\$ + C_\$\)</li>
    </ul>
  </li>
</ul>

<h2 id="additional-results">Additional results</h2>

<ul>
  <li>\(T_S(t') = (1-t')\) is the normalized saved time for both parties
    <blockquote>
      <p><em>Each party saves time, but the model does not evaluate how this time is used nor quantifies it in terms of money.</em> This could translate into a marketing advantage for the customer and room for other projects or free time for the provider.</p>
    </blockquote>
  </li>
  <li>Provider income: \(P_\$(t')=(B*t'+C_\$(t'))=...=B(1-ABSF(t')·T_S(t')) &lt; B\)
    <ul>
      <li>This amount is never bigger than the maximum budget.</li>
      <li>If \(ABSF(t') = 0\), the customer has no savings and the provider gets the full budget. (See the example about the Predatory Provider in the <a href="/en/an-agile-budgeting-proposal-part-III">next post</a>)</li>
      <li>If \(T_S(t') = 0\), it means that project reached its end exactly at the predicted maximum deadline, spending all the budget.</li>
    </ul>
  </li>
</ul>

<h2 id="constant-model">Constant model</h2>

<p>As an example, we can assume that the split function a fixed percentage, so that \(ABSF(t') = ABSF_0\), where \(ABSF_0\) is the constant.</p>

<blockquote>
  <p>This means that the customer will save the same percentage of the remaining budget at any point in time and this amount will be also the compensation for the blocked time.</p>
</blockquote>

<p>For example, imagine we settle a project with these parameters:</p>

<ul>
  <li>Max budget: \(B=400000\)</li>
  <li>Max duration: \(D_B=10\)months</li>
  <li>Let’s give some room to the customer: \(ABSF(t') = ABSF_0 = 0.8\)</li>
</ul>

<p>Imagine that something happens because things happen and the customer wants out at \(t'=0.5\) (half of the project duration).</p>

<p><em>Then:</em></p>

<ul>
  <li>\(B_R(0.5) = B·(1-0.5) = B·(0.5) = 200000\) has not been spent yet.</li>
  <li>\(S_\$(0.5) = B_R(0.5)·ABSF = 200000·0.8 = 160000\) are the economic savings for the customer</li>
  <li>\(C_\$(0.5) = B_R(0.5)·(1-ABSF) = 200000·0.2 = 40000\) is the economic compensation for the blocked time (opportunity cost)</li>
  <li>\(P_\$(0.5) = (B·t'+C_\$(0.5)) = (400000·0.5+40000) = 240000\) is the provider income</li>
  <li>\(T_S(0.5) = (1-t') = (1-0.5) = 0.5\) is the normalized saved time for both parties, which corresponds with 5 months.</li>
</ul>

<h3 id="is-the-constant-model-useful">Is the constant model useful?</h3>

<p>I find this model too simple but it is an applied example about how to apply the principles. It is easy to understand and it is easy to calculate.</p>

<blockquote>
  <p>Maybe some ABSF in a sigmoid shape could be interesting. Something to protect the customer from poor value deliveries in the first stages and to protect the provider from the customer’s whims once the project is mature. Maybe some “tunable” sigmoid like <a href="https://dhemery.github.io/DHE-Modules/technical/sigmoid/#function">these</a> could be interesting.</p>
</blockquote>

<h2 id="integrating-this-model-in-your-business-as-a-software-provider">Integrating this model in your business as a software provider</h2>

<ul>
  <li>Project can be negotiated as a regular waterfall project in terms of budget and deadline limitations, but these are just <strong>boundary conditions</strong> (maximums), not mandatory limits that must be reached.
    <ul>
      <li>This helps the sales team to sell the project using their regular sales pitch with some variation.</li>
      <li>This helps the customer to understand the project in terms of their regular project management.</li>
    </ul>
  </li>
  <li>
    <p>The development will follow an iterative process where the customer <strong>must</strong> be an active part, providing feedback about value provided.</p>
  </li>
  <li>
    <p>All split conditions for the remaining budget are known and agreed upon by both parties. No surprises. No bargaining post-kickoff.</p>
  </li>
  <li>If the feedback is bad during the early stages of the development, customer can retire saving most of the remaining budget, but not all of it. The team will be compensated for the work done and the blocked time (opportunity cost).
    <ul>
      <li>The earlier the customer retires, the more money they save but the less value they get.</li>
    </ul>
  </li>
  <li>
    <p>If the feedback is good during the development, the development will reach some point where the customer will decide that there is no more value to be added before reaching the deadline and the project can be considered <strong>done</strong>.</p>

    <ul>
      <li>In this case, the customer can save part of the remaining budget, but not all of it. The team will be compensated for <strong>early delivery</strong> of the <strong>highest possible value</strong>.</li>
      <li>The customer gets top-value in less time for less money.</li>
      <li>The team gets higher compensation/effort ratio, plus more time to work on other projects (or to rest).</li>
    </ul>
  </li>
</ul>

<hr />

<p>In the <a href="en-an-agile-budgeting-proposal-part-III">next article</a> I show some Q&amp;A and degenerated cases to get some perspective.</p>]]></content><author><name>Dani Ramírez</name></author><category term="agile" /><category term="business" /><category term="lean" /><category term="WIP" /><summary type="html"><![CDATA[DISCLAIMER: This is a WIP This is the second part of a series of posts about agile budgeting. The first part can be found here. Agile Budget Split Function \(ABSF(t')\) As I mentioned in the previous part, this is the function that condenses all the model. It’s shape defines the balance between the customer’s and the provider’s interests at any given moment and how money and time are balanced. Given that: Project has a maximum budget \(B\) Project has a maximum duration \(D_B\) Elapsed time at a given moment is \(t\). Normalized time is \(t'=t/D_B\) with \(t'\in[0,1]\) \(t'=0\) means that the project has just started \(t'=1\) means that the project has reached the deadline Remaining budget at a given moment is \(B_R(t')=B-(B/D)·t=B(1-t/D) = B(1-t')\) Then, we can split the remaining budget in two parts if the project stops at a given moment \(t'\): \(ABSF(t')\in[0,1]\) is the split factor function. It represents what percentage of the remaining budget is saved by the customer if they retire at a given moment \(t'\). \(S_\$(t') = B_R(t')·ABSF(t')\) are the economic savings for the customer \(C_\$(t') = B_R(t')·(1-ABSF(t'))\) is the economic compensation for the future blocked time (opportunity cost) So, the remaining budget is the sum of both savings plus compensation: \(B_R(t') = S_\$ + C_\$\) Additional results \(T_S(t') = (1-t')\) is the normalized saved time for both parties Each party saves time, but the model does not evaluate how this time is used nor quantifies it in terms of money. This could translate into a marketing advantage for the customer and room for other projects or free time for the provider. Provider income: \(P_\$(t')=(B*t'+C_\$(t'))=...=B(1-ABSF(t')·T_S(t')) &lt; B\) This amount is never bigger than the maximum budget. If \(ABSF(t') = 0\), the customer has no savings and the provider gets the full budget. (See the example about the Predatory Provider in the next post) If \(T_S(t') = 0\), it means that project reached its end exactly at the predicted maximum deadline, spending all the budget. Constant model As an example, we can assume that the split function a fixed percentage, so that \(ABSF(t') = ABSF_0\), where \(ABSF_0\) is the constant. This means that the customer will save the same percentage of the remaining budget at any point in time and this amount will be also the compensation for the blocked time. For example, imagine we settle a project with these parameters: Max budget: \(B=400000\) Max duration: \(D_B=10\)months Let’s give some room to the customer: \(ABSF(t') = ABSF_0 = 0.8\) Imagine that something happens because things happen and the customer wants out at \(t'=0.5\) (half of the project duration). Then: \(B_R(0.5) = B·(1-0.5) = B·(0.5) = 200000\) has not been spent yet. \(S_\$(0.5) = B_R(0.5)·ABSF = 200000·0.8 = 160000\) are the economic savings for the customer \(C_\$(0.5) = B_R(0.5)·(1-ABSF) = 200000·0.2 = 40000\) is the economic compensation for the blocked time (opportunity cost) \(P_\$(0.5) = (B·t'+C_\$(0.5)) = (400000·0.5+40000) = 240000\) is the provider income \(T_S(0.5) = (1-t') = (1-0.5) = 0.5\) is the normalized saved time for both parties, which corresponds with 5 months. Is the constant model useful? I find this model too simple but it is an applied example about how to apply the principles. It is easy to understand and it is easy to calculate. Maybe some ABSF in a sigmoid shape could be interesting. Something to protect the customer from poor value deliveries in the first stages and to protect the provider from the customer’s whims once the project is mature. Maybe some “tunable” sigmoid like these could be interesting. Integrating this model in your business as a software provider Project can be negotiated as a regular waterfall project in terms of budget and deadline limitations, but these are just boundary conditions (maximums), not mandatory limits that must be reached. This helps the sales team to sell the project using their regular sales pitch with some variation. This helps the customer to understand the project in terms of their regular project management. The development will follow an iterative process where the customer must be an active part, providing feedback about value provided. All split conditions for the remaining budget are known and agreed upon by both parties. No surprises. No bargaining post-kickoff. If the feedback is bad during the early stages of the development, customer can retire saving most of the remaining budget, but not all of it. The team will be compensated for the work done and the blocked time (opportunity cost). The earlier the customer retires, the more money they save but the less value they get. If the feedback is good during the development, the development will reach some point where the customer will decide that there is no more value to be added before reaching the deadline and the project can be considered done. In this case, the customer can save part of the remaining budget, but not all of it. The team will be compensated for early delivery of the highest possible value. The customer gets top-value in less time for less money. The team gets higher compensation/effort ratio, plus more time to work on other projects (or to rest). In the next article I show some Q&amp;A and degenerated cases to get some perspective.]]></summary></entry><entry><title type="html">An agile budgeting proposal - Part III</title><link href="https://danibishop.com/agile/business/lean/2022/11/24/en-an-agile-budgeting-proposal-part-III.html" rel="alternate" type="text/html" title="An agile budgeting proposal - Part III" /><published>2022-11-24T00:00:00+00:00</published><updated>2022-11-24T00:00:00+00:00</updated><id>https://danibishop.com/agile/business/lean/2022/11/24/en-an-agile-budgeting-proposal-part-III</id><content type="html" xml:base="https://danibishop.com/agile/business/lean/2022/11/24/en-an-agile-budgeting-proposal-part-III.html"><![CDATA[<blockquote>
  <p>DISCLAIMER: This is a WIP</p>
</blockquote>

<blockquote>
  <p>This is the third and last part of a series of posts about agile budgeting. The first part with the basics can be found <a href="en-an-agile-budgeting-proposal-part-I">here</a> and the second (with the mathematical theory) <a href="en-an-agile-budgeting-proposal-part-II">here</a>.</p>
</blockquote>

<h2 id="some-questions">Some questions</h2>

<h3 id="what-happens-if-project-is-about-to-reach-deadline-and-customer-is-not-satisfied-with-the-value-delivered">What happens if “project is about to reach deadline and customer is not satisfied with the value delivered”?</h3>

<p>That scenario means that the agile process is not working in this project. Not meeting a deadline is something that can be predicted and avoided given the constraints I provided above.</p>

<p>I am not saying that this is not a real problem, I just say that it does not apply to this proposal in its current form.</p>

<h3 id="why-not-predate-the-budget-with-a-draconian-contract">Why not predate the budget with a draconian contract?</h3>

<p>Because our work is to deliver value, not to pay lawyers to write smart contracts. If you prefer to predate the budget in case of early retirement, go ahead. But then you are not in the software business, you are in the legal business.</p>

<p>This is a suboptimal solution as delivering value way before the deadline has more direct and potential income.</p>

<h3 id="how-the-hell-are-you-going-to-explain-this-to-the-customer">How the hell are you going to explain this to the customer?</h3>

<p>First condition: the customer must trust the team. If the customer does not trust the team, then this proposal is not going to work.</p>

<p>Also, define a \(ABSF(t')\) that is easy to explain. Maybe a constant is good enough. This is a business decision.</p>

<h2 id="degenerate-cases">Degenerate cases</h2>

<h3 id="provider-predatory-model">Provider predatory model</h3>

<p>In this model we rely on lawyers to write a contract where, once it is signed, the customer is punished if they decide to retire early. This is a very bad idea, but it is a model that exists in the real world. I just want to express it in terms of the previous equations.</p>

<p>In this case, as the customer has to spend the whole budget in any case, the project will go on until the deadline, no matter what. Trust is destroyed in this kind of scenario, IMHO.</p>

<p>As there is no trust, any attempt to deliver value early will be translated into artificial work that will not add value to the customer. This is a waste of time and money for everybody.</p>

<ul>
  <li>\(ABSF(t') = 0\), provider predates the budget excess</li>
  <li>\(S_\$(t') = 0\), no savings in the budget</li>
  <li>\(C_\$(t') = B_R(t') = B(1-t')\), but this will eventually be zero as \(t'=1\) because of artificially extended delivery time.</li>
  <li>\(T_S(t') = 0\), no savings in time</li>
</ul>

<h3 id="customer-predatory-model">Customer predatory model</h3>

<p>In this model the provider is not compensated for the blocked time if the customer decides to retire early.</p>

<ul>
  <li>\(ABSF(t') = 1\), customer predates the budget excess</li>
  <li>\(C_\$(t') = 0\), no compensation for the opportunity cost</li>
  <li>\(S_\$(t') = B_R(t') = B(1-t')\), all savings in the budget</li>
  <li>\(T_S(t') = 0\), no savings in time</li>
</ul>

<p>In this scenario the customer has all power. They can retire at any time and save all the remaining budget. The provider will not be compensated for the blocked time, but they will be compensated for the work done.</p>

<p>Anyhow, under this constraints there is no benefit on delivering early, so the provider will keep value hostage to ensure the next payment. This is a waste of time and money for everybody. Again.</p>

<h2 id="a-really-good-talk-about-this">A really good talk about this</h2>

<p>Here you have a talk from AgileIndia 2015 by <a href="https://theagiledirector.com/about/">Evan Leybourn</a> about managing Agile projects. It is worth watching. A couple of times.</p>

<div class="embed-container">
  <iframe width="560" height="315" src="https://www.youtube.com/embed/Btz-D84UXw4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
</div>

<h2 id="todo-for-the-series">TODO (for the series)</h2>
<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Add all examples</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Add references</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Add plots</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Spanish translation</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Add LaTeX support</li>
</ul>]]></content><author><name>Dani Ramírez</name></author><category term="agile" /><category term="business" /><category term="lean" /><category term="WIP" /><summary type="html"><![CDATA[DISCLAIMER: This is a WIP This is the third and last part of a series of posts about agile budgeting. The first part with the basics can be found here and the second (with the mathematical theory) here. Some questions What happens if “project is about to reach deadline and customer is not satisfied with the value delivered”? That scenario means that the agile process is not working in this project. Not meeting a deadline is something that can be predicted and avoided given the constraints I provided above. I am not saying that this is not a real problem, I just say that it does not apply to this proposal in its current form. Why not predate the budget with a draconian contract? Because our work is to deliver value, not to pay lawyers to write smart contracts. If you prefer to predate the budget in case of early retirement, go ahead. But then you are not in the software business, you are in the legal business. This is a suboptimal solution as delivering value way before the deadline has more direct and potential income. How the hell are you going to explain this to the customer? First condition: the customer must trust the team. If the customer does not trust the team, then this proposal is not going to work. Also, define a \(ABSF(t')\) that is easy to explain. Maybe a constant is good enough. This is a business decision. Degenerate cases Provider predatory model In this model we rely on lawyers to write a contract where, once it is signed, the customer is punished if they decide to retire early. This is a very bad idea, but it is a model that exists in the real world. I just want to express it in terms of the previous equations. In this case, as the customer has to spend the whole budget in any case, the project will go on until the deadline, no matter what. Trust is destroyed in this kind of scenario, IMHO. As there is no trust, any attempt to deliver value early will be translated into artificial work that will not add value to the customer. This is a waste of time and money for everybody. \(ABSF(t') = 0\), provider predates the budget excess \(S_\$(t') = 0\), no savings in the budget \(C_\$(t') = B_R(t') = B(1-t')\), but this will eventually be zero as \(t'=1\) because of artificially extended delivery time. \(T_S(t') = 0\), no savings in time Customer predatory model In this model the provider is not compensated for the blocked time if the customer decides to retire early. \(ABSF(t') = 1\), customer predates the budget excess \(C_\$(t') = 0\), no compensation for the opportunity cost \(S_\$(t') = B_R(t') = B(1-t')\), all savings in the budget \(T_S(t') = 0\), no savings in time In this scenario the customer has all power. They can retire at any time and save all the remaining budget. The provider will not be compensated for the blocked time, but they will be compensated for the work done. Anyhow, under this constraints there is no benefit on delivering early, so the provider will keep value hostage to ensure the next payment. This is a waste of time and money for everybody. Again. A really good talk about this Here you have a talk from AgileIndia 2015 by Evan Leybourn about managing Agile projects. It is worth watching. A couple of times. TODO (for the series) Add all examples Add references Add plots Spanish translation Add LaTeX support]]></summary></entry><entry><title type="html">Una cosa que debes dominar para ganar dinero de verdad haciendo software</title><link href="https://danibishop.com/basics/2022/11/23/Para-ganar-dinero-con-software-debes-aprender-esto.html" rel="alternate" type="text/html" title="Una cosa que debes dominar para ganar dinero de verdad haciendo software" /><published>2022-11-23T00:00:00+00:00</published><updated>2022-11-23T00:00:00+00:00</updated><id>https://danibishop.com/basics/2022/11/23/Para-ganar-dinero-con-software-debes-aprender-esto</id><content type="html" xml:base="https://danibishop.com/basics/2022/11/23/Para-ganar-dinero-con-software-debes-aprender-esto.html"><![CDATA[<blockquote>
  <p>Disclaimer: Si vienes buscando nombres de lenguajes, frameworks, herramientas, etc., no vas a encontrarlos aquí. También ten en cuenta que el contexto de este artículo es el de alguien desarrollando software viviendo en España en el año 2022; puede que lo que escribo no sea aplicable a tu contexto por muchos motivos.</p>
</blockquote>

<h2 id="no-es-un-lenguaje-de-programación">No es un lenguaje de programación</h2>

<p>Podría poner enlaces aquí a artículos sobre tendencias en la industria o sobre lenguajes que están de moda, pero no lo voy a hacer. Los lenguajes van y vienen y, sobre todo, tienen características que los hacen más o menos adecuados a diferentes proyectos.</p>

<p>En tu carrera profesional seguramente transicionarás entre varios lenguajes (o versiones del mismo). Si bien esto te va a facilitar el encontrar trabajo, no es lo que te va a permitir ganar dinero <strong>de verdad</strong>.</p>

<h2 id="no-es-un-framework">No es un framework</h2>

<p>Los frameworks son herramientas que te permiten, supuestamente, construir software más rápido. De hecho, muchas veces la popularidad de un lenguaje va ligada a la popularidad de un framework (Ruby/RoR, os estoy mirando a vosotros).</p>

<p>De nuevo, el saber de un framework seguramente te abra puertas (a la vez que te cierra otras, por cierto), pero ganar dinero <strong>de verdad</strong> va de otra cosa.</p>

<h2 id="qué-es-lo-que-te-va-a-permitir-ganar-dinero-de-verdad">¿Qué es lo que te va a permitir ganar dinero <strong>de verdad</strong>?</h2>

<p>Pues para quién lo vive ya, es evidente. Y para las madres de los 80/90, también. El mundo está virando en otras direcciones, pero a día de hoy lo que marca la diferencia es <strong>SER CAPAZ DE MANTENER UNA COMUNICACIÓN FLUIDA EN INGLÉS SIN MIEDO; TANTO HABLANDO COMO POR ESCRITO</strong>.</p>

<p>Hala. Ya soy tu abuela.</p>

<h2 id="la-diferenciación">La diferenciación</h2>

<p>A pesar de vivir rodeados de cultura anglosajona, con capacidad de consumir miles de piezas de entretenimiento en inglés, viviendo en un mundo tecnológico que se mueve en inglés, el porcentaje de gente que se siente cómoda viviendo en inglés a diario es bastante bajo.</p>

<blockquote>
  <p>Creo recordar algo como que del 30% de gente que habla inglés, sólo el 20% considera que lo hace con nivel alto. Eso es un 6% en la población general. Teniendo en cuenta que el nivel de inglés correla bastante bien con el nivel de estudios y que en nuestro sector abunda el nivel alto de estudios, igual podemos subir el porcentaje a un 10% de la población en el sector para hacernos una idea.</p>
</blockquote>

<p>Resulta que tras décadas de tener el inglés por todos lados, el dominarlo a nivel medio es algo que te hace destacar del resto.</p>

<h2 id="a-qué-me-refiero-con-de-verdad">A qué me refiero con “de verdad”</h2>

<p>A día de hoy, todavía encuentro ofertas para “juniors” pagando en torno a 25K€/año. Teniendo en cuenta lo que una empresa suele ganar con el trabajo de cualquier trabajador, sobre todo en el sector tecnológico, es una cantidad ridícula.</p>

<p>Luego está el problema del techo. Por mucha experiencia que acumules y mucha responsabilidad que asumas, parece que hay un techo entre los 60k y los 80k si buscas en empresas netamente españolas (y en bastantes extranjeras, no voy a mentir).</p>

<p>Puede parecer que esas cantidades están muy bien… y lo están dado el contexto, pero el potencial de ganar mucho más es muy alto en cuanto te mueves a empresas de <strong>producto propio (o startups) extranjeras</strong>; sobre todo en USA.</p>

<p>Hablamos de salarios de 100k, 150k, 200k, 300k, 400k, 500k… y más. Y no hablo de CEOs, hablo de gente que hace código.</p>

<p>Según datos de <code>levels.fyi</code>:</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">Experiencia</th>
      <th style="text-align: right">Salario mediano</th>
      <th style="text-align: right">Top 10%</th>
      <th style="text-align: left">Región</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">Entry</td>
      <td style="text-align: right">29k€</td>
      <td style="text-align: right">57k€+</td>
      <td style="text-align: left">España</td>
    </tr>
    <tr>
      <td style="text-align: left">Entry</td>
      <td style="text-align: right">61k€</td>
      <td style="text-align: right">81k€+</td>
      <td style="text-align: left">Alemania</td>
    </tr>
    <tr>
      <td style="text-align: left">Entry</td>
      <td style="text-align: right"><strong>165k€</strong></td>
      <td style="text-align: right"><strong>213k€+</strong></td>
      <td style="text-align: left">SF Bay Area (USA)</td>
    </tr>
    <tr>
      <td style="text-align: left">Senior</td>
      <td style="text-align: right">62k€</td>
      <td style="text-align: right">108k€+</td>
      <td style="text-align: left">España</td>
    </tr>
    <tr>
      <td style="text-align: left">Senior</td>
      <td style="text-align: right">84k€</td>
      <td style="text-align: right">110k€+</td>
      <td style="text-align: left">Alemania</td>
    </tr>
    <tr>
      <td style="text-align: left">Senior</td>
      <td style="text-align: right"><strong>274k$</strong></td>
      <td style="text-align: right"><strong>450k$+</strong></td>
      <td style="text-align: left">SF Bay Area (USA)</td>
    </tr>
  </tbody>
</table>

<h2 id="en-realidad-no-basta-con-el-idioma">En realidad no basta con el idioma</h2>

<p>El idioma es barrera de entrada pero también hay <strong>que saber hacer las cosas</strong>. Cuanto más subes de salario, más competitiva está la cosa en general (aunque hay empresas donde esta presión es menor). Te vas a encontrar con gente top de la industria, con mucha experiencia y, posiblemente, nativos. También hay gente paquete, pero mejor pensar que vas a una liga superior de entrada.</p>

<p>Hay también un componente muy importante de seguridad en ti. Muchas veces nos cuesta aprovechar una oportunidad para cambiar de puesto de trabajo, incluso en nuestro propio idioma, porque es muy difícil romper la inercia de estar en un sitio que ya conoces y que te da de comer aunque tenga sus problemas.</p>

<p>Si ya es difícil así, súmale el tener que hablar otro idioma. Y súmale, en muchos casos, una componente importante de síndrome del impostor. Cuando ves las diferencias salariales entre un perfil junior en inglés y un perfil senior en español, es fácil caer en la tentación de pensar que no eres lo suficientemente bueno para trabajar en inglés.</p>

<p>Ahí es donde entra la segunda parte del asunto: <strong>sin miedo</strong>. La confianza viene con la práctica, así que a lo mejor interesa practicar más inglés y menos <code>React</code>, porque el tiempo es finito y no puedes hacerlo todo.</p>

<h2 id="y-en-el-futuro">Y, ¿en el futuro?</h2>

<p>Hay quién dice que deberíamos aprender chino mandarín. Hay quién dice que con el español no hay problema, sobre todo viendo la tendencia en USA. Hay quién dice que el inglés va a desaparecer y que el futuro es el español.</p>

<p>Yo lo que sé es que un cambio cultural tan grande como desplazar la lengua hegemónica en la industria no sucede en 1, 2 o 10 años. Bueno, en 10 a lo mejor. Pero en el peor caso has usado esos 10 años a su máximo potencial y has podido ganar dinero <strong>de verdad</strong> a la vez que te has preparado para el futuro.</p>

<h2 id="cómo-aprendí-yo">Cómo aprendí yo</h2>

<p>Como no soy nadie para decirte como debes aprender con tus circunstancias, me limito a comentar como me fue a mí.</p>

<p>A mí me funcionó una mezcla entre ir a EGB/BUP/COU y tener mucho ocio en inglés sin alternativa en español. Especialmente videojuegos, música, libros, comics… El querer disfrutar de estas obras me creó un interés desmedido por aprender el idioma.</p>

<p>Esto era todo consumo pásivo en su mayor parte; no empecé a hablar a diario hasta que me mudé a Alemania (donde, además, aprendí alemán).</p>

<p>Hay un componente muy relevante social en todo esto. Si eres de perfil tímido o introvertido, seguramente debas poner más de tu parte para encontrar tu ambiente adecuado donde practicar inglés y este tipo de perfiles es bastante común en nuestra industria.</p>

<p>Yo, entre que soy bastante introvertido y que acabé harto de ir a clases en mis años de universidad, siempre he tenido una vertiente muy autodidacta. Si te funciona, pues es una opción. O tira de apps, podcasts, libros, cursos reglados, etc.</p>]]></content><author><name>Dani Ramírez</name></author><category term="basics" /><category term="Other" /><summary type="html"><![CDATA[Disclaimer: Si vienes buscando nombres de lenguajes, frameworks, herramientas, etc., no vas a encontrarlos aquí. También ten en cuenta que el contexto de este artículo es el de alguien desarrollando software viviendo en España en el año 2022; puede que lo que escribo no sea aplicable a tu contexto por muchos motivos. No es un lenguaje de programación Podría poner enlaces aquí a artículos sobre tendencias en la industria o sobre lenguajes que están de moda, pero no lo voy a hacer. Los lenguajes van y vienen y, sobre todo, tienen características que los hacen más o menos adecuados a diferentes proyectos. En tu carrera profesional seguramente transicionarás entre varios lenguajes (o versiones del mismo). Si bien esto te va a facilitar el encontrar trabajo, no es lo que te va a permitir ganar dinero de verdad. No es un framework Los frameworks son herramientas que te permiten, supuestamente, construir software más rápido. De hecho, muchas veces la popularidad de un lenguaje va ligada a la popularidad de un framework (Ruby/RoR, os estoy mirando a vosotros). De nuevo, el saber de un framework seguramente te abra puertas (a la vez que te cierra otras, por cierto), pero ganar dinero de verdad va de otra cosa. ¿Qué es lo que te va a permitir ganar dinero de verdad? Pues para quién lo vive ya, es evidente. Y para las madres de los 80/90, también. El mundo está virando en otras direcciones, pero a día de hoy lo que marca la diferencia es SER CAPAZ DE MANTENER UNA COMUNICACIÓN FLUIDA EN INGLÉS SIN MIEDO; TANTO HABLANDO COMO POR ESCRITO. Hala. Ya soy tu abuela. La diferenciación A pesar de vivir rodeados de cultura anglosajona, con capacidad de consumir miles de piezas de entretenimiento en inglés, viviendo en un mundo tecnológico que se mueve en inglés, el porcentaje de gente que se siente cómoda viviendo en inglés a diario es bastante bajo. Creo recordar algo como que del 30% de gente que habla inglés, sólo el 20% considera que lo hace con nivel alto. Eso es un 6% en la población general. Teniendo en cuenta que el nivel de inglés correla bastante bien con el nivel de estudios y que en nuestro sector abunda el nivel alto de estudios, igual podemos subir el porcentaje a un 10% de la población en el sector para hacernos una idea. Resulta que tras décadas de tener el inglés por todos lados, el dominarlo a nivel medio es algo que te hace destacar del resto. A qué me refiero con “de verdad” A día de hoy, todavía encuentro ofertas para “juniors” pagando en torno a 25K€/año. Teniendo en cuenta lo que una empresa suele ganar con el trabajo de cualquier trabajador, sobre todo en el sector tecnológico, es una cantidad ridícula. Luego está el problema del techo. Por mucha experiencia que acumules y mucha responsabilidad que asumas, parece que hay un techo entre los 60k y los 80k si buscas en empresas netamente españolas (y en bastantes extranjeras, no voy a mentir). Puede parecer que esas cantidades están muy bien… y lo están dado el contexto, pero el potencial de ganar mucho más es muy alto en cuanto te mueves a empresas de producto propio (o startups) extranjeras; sobre todo en USA. Hablamos de salarios de 100k, 150k, 200k, 300k, 400k, 500k… y más. Y no hablo de CEOs, hablo de gente que hace código. Según datos de levels.fyi: Experiencia Salario mediano Top 10% Región Entry 29k€ 57k€+ España Entry 61k€ 81k€+ Alemania Entry 165k€ 213k€+ SF Bay Area (USA) Senior 62k€ 108k€+ España Senior 84k€ 110k€+ Alemania Senior 274k$ 450k$+ SF Bay Area (USA) En realidad no basta con el idioma El idioma es barrera de entrada pero también hay que saber hacer las cosas. Cuanto más subes de salario, más competitiva está la cosa en general (aunque hay empresas donde esta presión es menor). Te vas a encontrar con gente top de la industria, con mucha experiencia y, posiblemente, nativos. También hay gente paquete, pero mejor pensar que vas a una liga superior de entrada. Hay también un componente muy importante de seguridad en ti. Muchas veces nos cuesta aprovechar una oportunidad para cambiar de puesto de trabajo, incluso en nuestro propio idioma, porque es muy difícil romper la inercia de estar en un sitio que ya conoces y que te da de comer aunque tenga sus problemas. Si ya es difícil así, súmale el tener que hablar otro idioma. Y súmale, en muchos casos, una componente importante de síndrome del impostor. Cuando ves las diferencias salariales entre un perfil junior en inglés y un perfil senior en español, es fácil caer en la tentación de pensar que no eres lo suficientemente bueno para trabajar en inglés. Ahí es donde entra la segunda parte del asunto: sin miedo. La confianza viene con la práctica, así que a lo mejor interesa practicar más inglés y menos React, porque el tiempo es finito y no puedes hacerlo todo. Y, ¿en el futuro? Hay quién dice que deberíamos aprender chino mandarín. Hay quién dice que con el español no hay problema, sobre todo viendo la tendencia en USA. Hay quién dice que el inglés va a desaparecer y que el futuro es el español. Yo lo que sé es que un cambio cultural tan grande como desplazar la lengua hegemónica en la industria no sucede en 1, 2 o 10 años. Bueno, en 10 a lo mejor. Pero en el peor caso has usado esos 10 años a su máximo potencial y has podido ganar dinero de verdad a la vez que te has preparado para el futuro. Cómo aprendí yo Como no soy nadie para decirte como debes aprender con tus circunstancias, me limito a comentar como me fue a mí. A mí me funcionó una mezcla entre ir a EGB/BUP/COU y tener mucho ocio en inglés sin alternativa en español. Especialmente videojuegos, música, libros, comics… El querer disfrutar de estas obras me creó un interés desmedido por aprender el idioma. Esto era todo consumo pásivo en su mayor parte; no empecé a hablar a diario hasta que me mudé a Alemania (donde, además, aprendí alemán). Hay un componente muy relevante social en todo esto. Si eres de perfil tímido o introvertido, seguramente debas poner más de tu parte para encontrar tu ambiente adecuado donde practicar inglés y este tipo de perfiles es bastante común en nuestra industria. Yo, entre que soy bastante introvertido y que acabé harto de ir a clases en mis años de universidad, siempre he tenido una vertiente muy autodidacta. Si te funciona, pues es una opción. O tira de apps, podcasts, libros, cursos reglados, etc.]]></summary></entry><entry><title type="html">Learn to debug</title><link href="https://danibishop.com/basics/2022/11/23/en-learn-to-debug.html" rel="alternate" type="text/html" title="Learn to debug" /><published>2022-11-23T00:00:00+00:00</published><updated>2022-11-23T00:00:00+00:00</updated><id>https://danibishop.com/basics/2022/11/23/en-learn-to-debug</id><content type="html" xml:base="https://danibishop.com/basics/2022/11/23/en-learn-to-debug.html"><![CDATA[<blockquote>
  <p>tl;dr: Instead of reading code or inserting “temporary” code, learn to debug. Debugging allows you to see the actual values of variables and how the execution jumps from one line to another. Nowadays, most IDEs have built-in solutions for most common languages, so you don’t even need to be an expert: with just a bit of basic knowledge you’ll be able to debug your code.</p>
</blockquote>

<h3 id="do-you-see-yourself-in-any-of-these-situations">Do you see yourself in any of these situations?</h3>

<ul>
  <li>
    <p>You get a legacy codebase and you have to make changes to it. It has no tests and no docs. You need to understand it fast. You then try to read the code and run it to see what it does, maybe printing some stuff to console. After 2 weeks, you decide to run to the hills and retire from software development forever.</p>
  </li>
  <li>
    <p>You have a fancy project composed of multiple interconnected sub-systems/components/whatever you call them. You need to make a change in one of them, but you don’t know how it will affect the rest of the system. Luckily, you have tests in place! But these tests require a lot of configuration that is not documented. You spend 2 days trying to get the tests to run, and then you realize that they don’t even cover the part of the system you need to change. You decide to run to the hills and retire from software development forever.</p>
  </li>
  <li>
    <p>You have a bug in your code. You try to fix it, but you can’t reproduce it. You try to add some logging to see what’s going on, but you can’t reproduce it. You try to add some “temporary” code to see what’s going on, but you can’t reproduce it. You decide to run to the hills and retire from software development forever.</p>
  </li>
</ul>

<h2 id="if-your-answer-was-yes">If your answer was “yes”…</h2>

<p>Then you will be a much happier person once you learn <strong>how to use a debugger</strong>.</p>

<blockquote>
  <p>Debuggers are tools that allow you to inspect the state of your program while it’s running. They allow you to set breakpoints, which are points in your code where the program will stop and allow you to inspect the state of the program. You can then step through the code, line by line, and inspect the state of the program at each step. You can also inspect the state of variables, call functions, etc.</p>
</blockquote>

<ul>
  <li>Debuggers are non-intrusive: they don’t modify your code in any way. They just allow you to inspect the state of your program while it’s running.</li>
  <li>You can debug your tests. If some test suddendly fails, you can debug it to see what’s going on (some people could argue that this smells like a bad test because it cannot be “easily understood”, but that’s a different topic).</li>
</ul>

<h2 id="but-debugging-is-hard">But debugging is hard!</h2>

<p>Debugging is not hard; <strong>using ugly or complicated tools is hard</strong>. There is a lot of discussion about “how unfriendly <code>gdb</code> is”, but aside from these debates in the <code>C/C++</code> world, debugging most of the code out there is quite easy and straightforward nowadays most of the time.</p>

<p>Debugging Python, Javascript, Typescript, Java, C#, etc. (which represent around the 70% up to 90% of the code out there depending on the source you check) is nowadays fully supported by the IDEs and editors you use. You don’t need to learn a new tool, you just need to learn how to use the one you already have.</p>

<h2 id="some-authoritative-example">Some authoritative example</h2>

<p>Here you have John Carmack talking about IDEs and tools.</p>

<div class="embed-container">
  <iframe width="560" height="315" src="https://www.youtube.com/embed/tzr7hRXcwkw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
</div>

<blockquote>
  <p>He’s the creator of Doom, Quake, Wolfenstein 3D, and many other games. He’s also a very good programmer. He’s talking about how he uses the debugger to understand the code he’s reading.</p>
</blockquote>

<h2 id="todo">TODO</h2>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Add example</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Add references to pros and cons</li>
</ul>]]></content><author><name>Dani Ramírez</name></author><category term="basics" /><category term="debugging" /><summary type="html"><![CDATA[tl;dr: Instead of reading code or inserting “temporary” code, learn to debug. Debugging allows you to see the actual values of variables and how the execution jumps from one line to another. Nowadays, most IDEs have built-in solutions for most common languages, so you don’t even need to be an expert: with just a bit of basic knowledge you’ll be able to debug your code. Do you see yourself in any of these situations? You get a legacy codebase and you have to make changes to it. It has no tests and no docs. You need to understand it fast. You then try to read the code and run it to see what it does, maybe printing some stuff to console. After 2 weeks, you decide to run to the hills and retire from software development forever. You have a fancy project composed of multiple interconnected sub-systems/components/whatever you call them. You need to make a change in one of them, but you don’t know how it will affect the rest of the system. Luckily, you have tests in place! But these tests require a lot of configuration that is not documented. You spend 2 days trying to get the tests to run, and then you realize that they don’t even cover the part of the system you need to change. You decide to run to the hills and retire from software development forever. You have a bug in your code. You try to fix it, but you can’t reproduce it. You try to add some logging to see what’s going on, but you can’t reproduce it. You try to add some “temporary” code to see what’s going on, but you can’t reproduce it. You decide to run to the hills and retire from software development forever. If your answer was “yes”… Then you will be a much happier person once you learn how to use a debugger. Debuggers are tools that allow you to inspect the state of your program while it’s running. They allow you to set breakpoints, which are points in your code where the program will stop and allow you to inspect the state of the program. You can then step through the code, line by line, and inspect the state of the program at each step. You can also inspect the state of variables, call functions, etc. Debuggers are non-intrusive: they don’t modify your code in any way. They just allow you to inspect the state of your program while it’s running. You can debug your tests. If some test suddendly fails, you can debug it to see what’s going on (some people could argue that this smells like a bad test because it cannot be “easily understood”, but that’s a different topic). But debugging is hard! Debugging is not hard; using ugly or complicated tools is hard. There is a lot of discussion about “how unfriendly gdb is”, but aside from these debates in the C/C++ world, debugging most of the code out there is quite easy and straightforward nowadays most of the time. Debugging Python, Javascript, Typescript, Java, C#, etc. (which represent around the 70% up to 90% of the code out there depending on the source you check) is nowadays fully supported by the IDEs and editors you use. You don’t need to learn a new tool, you just need to learn how to use the one you already have. Some authoritative example Here you have John Carmack talking about IDEs and tools. He’s the creator of Doom, Quake, Wolfenstein 3D, and many other games. He’s also a very good programmer. He’s talking about how he uses the debugger to understand the code he’s reading. TODO Add example Add references to pros and cons]]></summary></entry></feed>