<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss version="2.0">
  <channel><description>Blog on technology, music and keyboards</description>
    <title type="text">Marco Valtas</title>
    <link>https://marcovaltas.com/</link>
    
        
            <item>
                <title>Who's going to review AI code?</title>
                <link>https://marcovaltas.com/2026/03/05/who-is-going-to-review-ai-code.html</link>
                <description>
                    &lt;p&gt;This question popped into my head back in November 2025 when I noticed that
more and more of the code I reviewed and created was being generated with the
help of AI tools. While four months feels like an eternity in this day and age,
the question still remains: who's going to review AI code?&lt;/p&gt;
&lt;h2&gt;Disclaimer&lt;/h2&gt;
&lt;p&gt;These days, writing about AI without a two-week expiration date attached is
quite the challenge. However, I believe there are some more stable topics and
questions we can explore related to the subject, without the risk of becoming
outdated by the time we finish this post. I use "AI-assisted programming,"
"AI," and "agents" somewhat interchangeably, and in all cases, I'm considering
the LLM type of AI tooling and not others. &lt;/p&gt;
&lt;h2&gt;Each generation raises the floor&lt;/h2&gt;
&lt;p&gt;Grady Booch cites that the history of software is a story of increasing levels
of abstraction, and I find this quite an accurate description. And when
discussing the topic of AI assisted programming this represents yet another
jump in abstraction.&lt;/p&gt;
&lt;p&gt;The abstraction framing is excellent because it provides parameters for
assessing how previous jumps in abstraction occurred. When transitioning from
assembly language to C, from C to C++, or even from punched cards to magnetic
memory, there's a period where both the current technology and the future
abstraction coexist. This transition period isn't just about porting existing
systems; it’s also meant to provide enough time for the new technology to be
adjusted and proven viable.&lt;/p&gt;
&lt;h2&gt;Who's on the hook?&lt;/h2&gt;
&lt;p&gt;Before diving into viability, let me jot down a few lines about liability. I’m
not referring to it in the strict legal sense but in the context of "Who did
this?" Most software development isn't highly risky, so I wouldn't assume that
all software engineers out there have had the chance to think deeply about the
topic of responsibility. However I think I can frame it in a way that most
software engineers can relate.&lt;/p&gt;
&lt;p&gt;A new library has been released for whatever purpose you find most
interesting. The library promises to solve common issues that arise from not
using it, and it also makes the case that it will &lt;em&gt;abstract&lt;/em&gt; parts of the
routines you need to work on, freeing up time for more important tasks. When
you start experimenting with this library, there's an implicit expectation
that it does what it claims, at least in terms of functionality. This isn't
about subtle bugs; the library works. After experimenting with it for some
time, you decide to bring it into your codebase.&lt;/p&gt;
&lt;p&gt;This whole process depends on the cost of integrating the library into your
codebase, making it worth the hassle of learning it, as well as the risks that
come with it. If the library is not stable from the start, you can still
include it, but you're taking on a larger risk since you might not be sure
about its overall stability or where it could leave you stranded. Note, you
are, as the engineer responsible for the system, ultimately responsible for the
overall codebase, even if you didn't review every line of the library.&lt;/p&gt;
&lt;p&gt;Over time, the library has proven to be useful, stable, and reliable, so at
this point, there are few concerns about any defects arising from it. The
library's &lt;em&gt;abstraction&lt;/em&gt; was successful, but more importantly, the &lt;em&gt;liability&lt;/em&gt;
of having it was balanced well enough that its use doesn't create a sense of
imminent failure in the system. Adding a new tool, language, or build system,
whatever it may be, all of these have a common trait: &lt;em&gt;they absorb the
liability of what they were designed for&lt;/em&gt;. If they don’t, your options are to
either choose another technology or create one yourself. &lt;/p&gt;
&lt;h2&gt;The trust problem&lt;/h2&gt;
&lt;p&gt;I’ve chosen a liability framing for this argument, but we can ultimately
reframe it as a trust challenge. Every time the topic of trusting what an AI
agent says comes up, this old joke always pops into my mind:&lt;/p&gt;
&lt;p&gt;All the professors from a university's engineering department win an
all-expenses-paid trip to the Bahamas. They board the plane, and the flight
attendant announces a warm welcome to the professors, mentioning that this
airplane was designed by their very own engineering students. All but one
professor stands up and leaves the plane. The flight attendant asks the
remaining professor, "Aren't you afraid of flying in this aircraft?" He
replies, "If it were my students who built and designed this thing, I'm
confident the engines won't even start!"&lt;/p&gt;
&lt;p&gt;Some of you might know that for certain applications, software can't be
designed and programmed in the same way most systems are created. From formal
specifications to considering bit flips caused by cosmic rays, minimizing
uncertainty is crucial depending on the required reliability of the system.
This process involves specific development patterns and verifiable testing
gauntlets that ensure the system is within its risk margin.&lt;/p&gt;
&lt;p&gt;Within our enterprise corporate systems, the bar is far lower but it is not
non-existent. One cannot break production every other day because the changes
were not reviewed. Which brings me back to the key point of this post:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The adoption of AI-assisted programming depends on how well it can
absorb the liability of its use in the first place.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The point is that it's not about whether AI-assisted programming can be
applied, but rather what degree of risk it can absorb. If we can develop
processes and tools that create a better liability shift, then its adoption can
grow until those techniques are no longer sufficient. In other words, the
adoption and use of AI-assisted programming hinge on our ability to trust the
artifacts produced; otherwise, the "gains" in productivity will be limited by
our capacity to verify. More succinctly, if you have to review all line changes
made by an AI agent, then its output is capped by that.&lt;/p&gt;
&lt;h2&gt;The verification gap&lt;/h2&gt;
&lt;p&gt;There are several efforts underway to create "better" ways to provide context
to AI tools. However, all of them face one or more significant limitations of
the current technology, along with another constraint: complex systems can
seldom be specified without incurring unacceptable costs for most
organizations.&lt;/p&gt;
&lt;p&gt;Back at my previous job at Thoughtworks, we used to say that our consultants
wrote a significantly larger amount of test code than production code. This
statement was a direct result of Agile software development, the iterative
process, eXtreme programming, and the fact that consultants would join ongoing
projects with tight deadlines to modify complex systems that could be decades
old without breaking everything else.&lt;/p&gt;
&lt;p&gt;Testing frameworks, continuous integration, continuous delivery, and other
techniques stem from our understanding that larger systems are complex.
Software is mostly grown rather than designed, and having situational awareness
of the current state of the system under change are key factors for most
software development.&lt;/p&gt;
&lt;p&gt;I believe that the pressure AI-assisted programming puts on the input side, by
generating and altering larger amounts of code, along with the non-determinism
of these technologies, heightens the need for verifying these changes.
Unfortunately, I still find that not all software engineers are adequately
trained in testing, as there have been few innovations in verification
technologies. This often results in complex test codebases, slow builds, and
high maintenance costs.&lt;/p&gt;
&lt;p&gt;So, while innovation is advancing on one side, investment in verification
technologies, techniques, processes, and other methods that engineers can rely
on is essential for successfully shifting the liability of adopting these
tools.&lt;/p&gt;
&lt;h2&gt;So, who reviews the code?&lt;/h2&gt;
&lt;p&gt;I hope I've shown that a successful adoption of these new AI tools into
software engineering isn't just about how well or better they perform. Given
the non-determinism and complexity of software-intensive systems, we won't be
able to harness all this innovation without also advancing our verification
technologies and modernizing our testing techniques. An engineer can't just
overlook the risks of changing a system; doing so isn't engineering, it's
gambling. Engineers use tools and processes to build safely.&lt;/p&gt;
                </description>
                <published>2026-03-05T00:00:00.000Z</published>
            </item>
        
    
        
            <item>
                <title>First thoughts on coding with AI</title>
                <link>https://marcovaltas.com/2023/06/07/first-thoughts-on-AI.html</link>
                <description>
                    &lt;p&gt;What is it like to code with AI? &lt;a href="https://copilot.github.com/"&gt;GitHub Copilot&lt;/a&gt;
promotes itself as "Your AI pair programmer." A catchy phrase, isn't it? But
can it actually live up to the title? And can it give our programming
productivity a real boost?&lt;/p&gt;
&lt;h3&gt;Copilot is not a pair programmer&lt;/h3&gt;
&lt;p&gt;First things first, labeling "GitHub Copilot as a pair programmer" somewhat
misrepresents what pair programming is all about. At best, it confuses people,
and at worst, it could lead managers to discourage real-life pair programming
sessions because, hey, we now have GitHub Copilot, right?&lt;/p&gt;
&lt;p&gt;If your only exposure to pair programming has been a scenario in which a
partner rapidly dictates the next few lines of code for you to type, without
providing a rationale for their chosen implementation, without contemplating
how their selections mesh with a future design, and without enlightening you
about a novel function you've never encountered before, it's no surprise if you
equate this with pair programming.&lt;/p&gt;
&lt;p&gt;However, let's get this clear: that's not how a pair programming session should
pan out. While this post isn't about the intricacies of pair programming, we
need to be clear that AI assisted programming is something different, and 
making shallow comparisons between the two is not helpful.&lt;/p&gt;
&lt;h3&gt;Intrusively valuable&lt;/h3&gt;
&lt;p&gt;Upon my first encounter with GitHub Copilot, my reaction was a blend of "Wow,
that's impressive!" and "Hold on! Let me complete my thought first!" This tool
has an eagerness to help that can be a tad intrusive. To handle this, you can
disable the "auto" part of its suggestion and trigger it manually via a
shortcut. But should you do that? I believe not.&lt;/p&gt;
&lt;p&gt;An AI system is there to suggest what it deems relevant or the logical next
step. If you manually control when it gives a suggestion, you may miss out on
some real gems. One feature that seems missing from GitHub Copilot's available
plugins is a set time delay before suggesting. A controllable delay would help
manage the interruptions while you're in the flow of typing.&lt;/p&gt;
&lt;h3&gt;Deceptively wrong&lt;/h3&gt;
&lt;p&gt;Let's acknowledge that there are many repeating patterns in programming. The
main word here is &lt;em&gt;patterns&lt;/em&gt;. I've found myself debugging an application
due to some strange behavior, only to discover that the AI had inserted a line
of code that seemed to follow a pattern but was actually incorrect.&lt;/p&gt;
&lt;p&gt;Sure, we've all encountered code blocks with repeated patterns and thought,
"This needs refactoring." But then, we often stumble upon tiny differences
between similar lines. So, one must ponder a bit before extracting methods or
carrying out other refactoring activities. AI makes similar errors—it
recognizes patterns but sometimes gets the variations wrong.&lt;/p&gt;
&lt;h3&gt;Suggestions versus lookup&lt;/h3&gt;
&lt;p&gt;AI code assistants typically operate in two modes. The first is auto-completion
as you type, and the second is generating code based on specific instructions.
Unfortunately, the AI doesn't seem to distinguish much between these two modes.
It suggests completions based on what you're currently writing, whether you're
in the middle of a function or just beginning one.&lt;/p&gt;
&lt;p&gt;The downside here relates to the length of the generated code and its context.
The auto-completion feature can sometimes suggest entire functions, which are
more often than not riddled with errors. The onus then falls on you, the
programmer, to spot and correct these mistakes or reject the suggestion
entirely.&lt;/p&gt;
&lt;p&gt;This brings me to an important point: the impact on workflow. Accepting a
ten-line code suggestion only to have to go back and correct it does not feel
like a productivity boost. I wish there were a way to limit the size of the
AI's suggestions. I'd prefer it to suggest a limited number of words while I'm
typing, so the coding process could continue moving forward rather than
backward.&lt;/p&gt;
&lt;h3&gt;Productivity&lt;/h3&gt;
&lt;p&gt;Whenever we talk about productivity in software development, we cannot overlook
Martin Fowler's iconic article &lt;a href="https://martinfowler.com/bliki/CannotMeasureProductivity.html"&gt;Cannot Measure
Productivity&lt;/a&gt;.
So, do the current AI systems make developers more productive?&lt;/p&gt;
&lt;p&gt;To be brutally honest, I don't know. Claims like "It made my team 10x more
productive" seem misleading. We've only had access to these tools for a short
while compared to the time it takes to develop and maintain a large system. Is
    this apparent productivity boost creating technical debt? If so, at what
    rate? And will the AI be capable of paying off this debt?&lt;/p&gt;
&lt;p&gt;Despite these looming questions, I can say from personal experience that AI can
be a boon if used judiciously. Consider the omnipresent Google and how it
affects software development. Despite its widespread availability, there's a
learning curve to using it effectively. If used without some understanding, you
might end up losing more time than gaining. On the other hand, if you know how
to use it, you can save a lot of time.&lt;/p&gt;
&lt;h3&gt;Reading, debugging, and learning with AI&lt;/h3&gt;
&lt;p&gt;A significant part of a developer's life involves reading code more than
writing it. How does AI affect these other crucial software development tasks?&lt;/p&gt;
&lt;p&gt;A few weeks ago, I had to comprehend a piece of &lt;em&gt;TypeScript&lt;/em&gt; code, a language
I'm not very familiar with. I fed the code to ChatGPT piece by piece, asking it
questions along the way. The AI was incredibly helpful, particularly when I
used the "Explain like I'm 5" option.&lt;/p&gt;
&lt;p&gt;However, there was a catch: the code was well-tested, and I used the tests to
supplement my learning. Having unit tests helped the AI to segregate cases and
implementation details, which facilitated my understanding. This experience
resembled a pair programming session more than simple auto-completion.&lt;/p&gt;
&lt;h3&gt;Final thoughts&lt;/h3&gt;
&lt;p&gt;As I was writing this blog post, GitHub announced Copilot's new Chat feature,
which now focuses more on comprehension rather than completion. Who knows, by
the time I finish writing this, there might be another announcement. This field
is developing at such a dizzying pace that I've questioned the relevance of
this post several times.&lt;/p&gt;
&lt;p&gt;Is there a way back from AI-assisted software development? Will it prove to be
inferior to the good old Google search? I don't think so. Although we need to
address numerous issues, such as copyright, the early results indicate that AI
offers an upgrade. The technology may need fine-tuning, but the demand it has
generated ensures it will be a staple in every software developer's life.&lt;/p&gt;
&lt;p&gt;Remember when IDEs and auto-completion were sneered at, with the popular belief
being that "a real developer uses a bare text editor!" There's no such thing as
"real developers" or demand for it, but there's definitely a need for working
code. AI definitely could help us to get there faster; for this reason, I don't
think AI help in software development is going away anytime soon.&lt;/p&gt;
                </description>
                <published>2023-06-07T00:00:00.000Z</published>
            </item>
        
    
        
            <item>
                <title>Build your own carbon intensity monitor</title>
                <link>https://marcovaltas.com/2022/10/29/pico2eq.html</link>
                <description>
                    &lt;p&gt;&lt;img alt="Pico Red" src="/assets/img/posts/pico/pico_red.jpeg" /&gt;
&lt;img alt="Pico Green" src="/assets/img/posts/pico/pico_green.jpeg" /&gt;&lt;/p&gt;
&lt;p&gt;While the &lt;a href="https://taikai.network/gsf/hackathons/carbonhack22" target="_blank"&gt;Carbon Hack 22&lt;/a&gt;
is happening, I decided to create my own hacking project, a carbon intensity
monitor. In this post, I'll describe how to put the monitor together, but you can
just go directly to &lt;a href="https://github.com/mavcunha/pico2eq" target="_blank"&gt;this project code on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;What's carbon intensity?&lt;/h3&gt;
&lt;p&gt;Carbon intensity is the rate of &lt;a href="https://www.eia.gov/tools/glossary/index.php?id=carbon%20intensity" target="_blank"&gt;carbon emitted per energy
produced&lt;/a&gt;.
The power we consume at home will be on the scale of &lt;em&gt;grams of CO&lt;sub&gt;2&lt;/sub&gt;eq
per kilowatt/hour&lt;/em&gt;, or &lt;code&gt;gCO2eq/kWh&lt;/code&gt;. So, if you have &lt;code&gt;100 gCO2eq/kWh&lt;/code&gt; carbon
intensity and &lt;code&gt;1 kW&lt;/code&gt; in an hour, the power grid emits &lt;code&gt;100g&lt;/code&gt; of carbon into
the atmosphere.&lt;/p&gt;
&lt;h3&gt;What's the purpose of knowing the carbon intensity?&lt;/h3&gt;
&lt;p&gt;Carbon intensity is not constant. Throughout the day, different energy mixes
are present in the power grid. During the day, you have solar power, while at
night, you don't. Here's an example of renewable sources in California
throughout the day.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.caiso.com/TodaysOutlook/Pages/supply.aspx" target="_blank"&gt;&lt;img alt="CAL-ISO" src="/assets/img/posts/pico/caliso_renewables_day.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What that means is that the carbon intensity during the day in California is
lower than at night because, at night, to cope with the absence of solar
energy, natural gas enters the mix. If you want to emit less carbon while using
power, you should use it when the carbon intensity is at its lowest.&lt;/p&gt;
&lt;h3&gt;Materials you will need&lt;/h3&gt;
&lt;p&gt;Raspberry Pi Pico W etc., are relatively cheap, but if you add tax and
shipping, it would add to approximately 40 dollars.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.pishop.us/product/raspberry-pi-pico-w/" target="_blank"&gt;Raspberry Pi Pico W ($6.00)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pishop.us/product/pico-display-pack/" target="_blank"&gt;Pico Display Pack ($16.95)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pishop.us/product/raspberry-pi-pico-header-set/" target="_blank"&gt;Raspberry Pi Pico Header Set ($1.95)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pishop.us/product/usb-a-to-micro-usb-b-cable-45cm-black-usb-2-0/" target="_blank"&gt;micro USB cable ($2.95)&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Note on soldering&lt;/strong&gt;: You will need to solder the &lt;em&gt;Header Set&lt;/em&gt; into the
&lt;em&gt;Pico W&lt;/em&gt;; If you do not want to do that, you can purchase a &lt;em&gt;Raspberry Pico
W Pre-Soldered&lt;/em&gt; on
&lt;a href="https://www.amazon.com/Raspberry-Pico-Header-Pre-soldered-Headers/dp/B0BCFNX7KF" target="_blank"&gt;amazon.com ($14.49)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note on prices&lt;/strong&gt;: These prices are from the time I'm writing this post; They certainly can
vary. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note on USB cable&lt;/strong&gt;: You probably have a micro USB cable. I've listed it just as a reminder you need one.&lt;/p&gt;
&lt;h3&gt;Soldering the Header Set&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;If you bought Raspberry Pi Pico W Pre-Soldered, you could skip this part&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Soldering the Header Set is easy if you know how to solder. If you don't know,
I recommend watching some &lt;a href="https://www.youtube.com/watch?v=QKbJxytERvg" target="_blank"&gt;tutorials on
YouTube&lt;/a&gt;. It
should be simple. You need to find a way to hold the thing together
while you solder. In my case, a
&lt;a href="https://en.wikipedia.org/wiki/Breadboard" target="_blank"&gt;breadboard&lt;/a&gt; did the trick.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Board with header set" src="/assets/img/posts/pico/header_set.jpg" /&gt;
&lt;img alt="Soldered Pico" src="/assets/img/posts/pico/soldered_pico.jpg" /&gt;&lt;/p&gt;
&lt;h4&gt;Assembling Pico Display with Pico&lt;/h4&gt;
&lt;p&gt;Join both, taking care of aligning the &lt;strong&gt;USB&lt;/strong&gt; icon on the display with 
the USB on the Pico.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Assemble Display and Pico" class="center" src="/assets/img/posts/pico/pico_and_display.jpg" /&gt;&lt;/p&gt;
&lt;h3&gt;Preparing the Raspberry Pi Pico W for your code&lt;/h3&gt;
&lt;p&gt;We're going to use &lt;a href="https://www.micropython.org/" target="_blank"&gt;micropython&lt;/a&gt; 
for our code. So the first step is to add it to our brand new
Raspberry Pico W.&lt;/p&gt;
&lt;p&gt;Because we're going to use &lt;strong&gt;Pico Display&lt;/strong&gt;, we are going to use its micropython
image. This image contains everything you need, plus the graphics libraries we
will use. So, we will follow the same steps described 
&lt;a href="https://www.raspberrypi.com/documentation/microcontrollers/micropython.html" target="_blank"&gt;here&lt;/a&gt;.
But we will download the image from
&lt;a href="https://github.com/pimoroni/pimoroni-pico/releases" target="_blank"&gt;Pimonori&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Adding micropython to Raspberry Pi Pico W&lt;/h4&gt;
&lt;p&gt;From Raspberry Pi's official documentation:
&lt;a class="center" href="https://github.com/raspberrypi/documentation/blob/develop/documentation/asciidoc/microcontrollers/micropython/drag-and-drop.adoc" target="_blank"&gt;&lt;img alt="Steps to add micropython" src="https://raw.githubusercontent.com/raspberrypi/documentation/develop/documentation/asciidoc/microcontrollers/micropython/images/MicroPython-640x360-v2.gif" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The instructions are simple:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download &lt;a href="https://github.com/pimoroni/pimoroni-pico/releases" target="_blank"&gt;Pimonori's micropython image&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Press and hold the BOOTSEL button on the Raspberry Pi Pico W and connect it to the USB while holding the button&lt;/li&gt;
&lt;li&gt;The Pico should now show on your computer as a mounted drive/folder&lt;/li&gt;
&lt;li&gt;Copy the image you downloaded in &lt;em&gt;1.&lt;/em&gt; to Pico's folder; it will automatically unmount and reboot.&lt;/li&gt;
&lt;li&gt;Start using your Raspberry Pi Pico W&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Writing and deploying your code into the Pico&lt;/h3&gt;
&lt;p&gt;The easiest and most friendly way to code in micropython for your Pico is to use the
&lt;a href="https://thonny.org/" target="_blank"&gt;Thonny IDE&lt;/a&gt;. It has everything you need to write your code,
plus it has a Python REPL, which is very helpful.&lt;/p&gt;
&lt;p&gt;I suggest you try some tasks before diving into the final code:&lt;/p&gt;
&lt;h5&gt;1. Make the Pico led blink&lt;/h5&gt;
&lt;p&gt;This is the equivalent of &lt;em&gt;Hello World&lt;/em&gt; in the world of microcontrollers.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-python" data-lang="Python"&gt;import machine
import time

LED = machine.Pin(&amp;quot;LED&amp;quot;, machine.Pin.OUT)

while True:
    LED.on()
    time.sleep_ms(500)
    LED.off()
    time.sleep_ms(500)
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;2. Use some printing for later debug&lt;/h5&gt;
&lt;p&gt;Keep this at hand; you might need to inspect some values if things
don't work as expected. I'm also showcasing that micropython supports
&lt;em&gt;f-strings&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-python" data-lang="Python"&gt;import machine
import time

LED = machine.Pin(&amp;quot;LED&amp;quot;, machine.Pin.OUT)

for i in range(10):
    print(f'{i=}')
    LED.toggle()
    time.sleep_ms(500)
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;3. Connect to the Wi-Fi&lt;/h5&gt;
&lt;p&gt;The Pico has a &lt;em&gt;2.4GHz&lt;/em&gt; antenna, so you need a 2.4GHz Wi-Fi connection. Most
routers are capable of 2.4Ghz network unless you explicitly disabled yours.&lt;/p&gt;
&lt;p&gt;This code is from &lt;a href="https://datasheets.raspberrypi.com/picow/connecting-to-the-internet-with-pico-w.pdf" target="_blank"&gt;Connecting to the Internet with Raspberry Pi Pico
W&lt;/a&gt;
section &lt;em&gt;3.6&lt;/em&gt;. Don't use it for production. This code is missing handling
connection errors.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-python" data-lang="Python"&gt;import network
import time

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('Wireless Network', 'The Password')

while not wlan.isconnected() and wlan.status() &amp;gt;= 0:
print(&amp;quot;Waiting to connect:&amp;quot;)
time.sleep(1)

print(wlan.ifconfig())
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;4. Play with the Display&lt;/h5&gt;
&lt;p&gt;Now explore the capabilities of the display, &lt;a href="https://github.com/pimoroni/pimoroni-pico/tree/main/micropython/modules/picographics" target="_blank"&gt;Pimonori's
picographics&lt;/a&gt; 
has an excellent API. You should check at least these demos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/pimoroni/pimoroni-pico/blob/main/micropython/examples/pico_display/balls_demo.py" target="_blank"&gt;balls demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pimoroni/pimoroni-pico/blob/main/micropython/examples/pico_display/button_test.py" target="_blank"&gt;button test&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pimoroni/pimoroni-pico/blob/main/micropython/examples/pico_display/rainbow.py" target="_blank"&gt;rainbow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Getting access to CO2signal API&lt;/h3&gt;
&lt;p&gt;For our carbon intensity data, we'll use
&lt;a href="https://www.co2signal.com/" target="_blank"&gt;CO2signal&lt;/a&gt;. It provides very
convenient data for us with the intensity and percentage of fossil fuels in the
power grid. Note that this API has rate limits, 30 requests in an hour and 1
request per second. So, be careful to not overwhelm their servers.&lt;/p&gt;
&lt;p&gt;You will need to find the longitude and latitude of your home; you can use
&lt;a href="https://www.geonames.org/postal-codes/" target="_blank"&gt;GeoNames&lt;/a&gt; for this.&lt;/p&gt;
&lt;p&gt;After obtaining your &lt;em&gt;API token&lt;/em&gt; you can test it like so:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-shell" data-lang="Shell"&gt;% curl 'https://api.co2signal.com/v1/latest?lon=6.8770394&amp;amp;lat=45.9162776' -H 'auth-token: myapitoken'
{
    &amp;quot;countryCode&amp;quot;: &amp;quot;FR&amp;quot;,
    &amp;quot;data&amp;quot;: {
        &amp;quot;carbonIntensity&amp;quot;: 93.0727344671727,
        &amp;quot;datetime&amp;quot;: &amp;quot;2017-02-09T08:30:00.000Z&amp;quot;,
        &amp;quot;fossilFuelPercentage&amp;quot;: 12.032514442152996
    },
    &amp;quot;status&amp;quot;: &amp;quot;ok&amp;quot;,
    &amp;quot;units&amp;quot;: {
        &amp;quot;carbonIntensity&amp;quot;: &amp;quot;gCO2eq/kWh&amp;quot;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can check the CO2 Signal &lt;a href="https://docs.co2signal.com/" target="_blank"&gt;documentation&lt;/a&gt;
for more information.&lt;/p&gt;
&lt;h3&gt;Setting all up and deploying the code&lt;/h3&gt;
&lt;p&gt;Go to &lt;a href="https://github.com/mavcunha/pico2eq" target="_blank"&gt;GitHub pico2eq&lt;/a&gt; and download this project code.&lt;/p&gt;
&lt;p&gt;You will need to create a configuration file called &lt;code&gt;config.json&lt;/code&gt; for &lt;em&gt;pico2eq&lt;/em&gt; to work. Here's the template:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-json" data-lang="JSON"&gt;{
  &amp;quot;wifi&amp;quot;: {
    &amp;quot;ssid&amp;quot;: &amp;quot;YOUR_WIFI_NAME&amp;quot;,
    &amp;quot;password&amp;quot;:&amp;quot;YOUR_WIFI_PASSWORD&amp;quot;
  },
  &amp;quot;co2signal&amp;quot;: {
    &amp;quot;token&amp;quot;: &amp;quot;YOUR_API_TOKEN&amp;quot;,
    &amp;quot;longitude&amp;quot;: YOUR_LONGITUDE,
    &amp;quot;latitude&amp;quot;: YOUR_LATITUDE
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You need to replace any &lt;em&gt;YOUR_&lt;/em&gt; with the appropriate information. This is
sensitive information; take caution to &lt;em&gt;not upload this file to the internet&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Once you have your configuration file, you can open &lt;a href="https://www.thonny.org" target="_blank"&gt;Thonny&lt;/a&gt; and
navigate to where the code is. You can now select everything and right-click to &lt;em&gt;Upload to /&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Thonny Upload" class="center" src="/assets/img/posts/pico/thonny_upload.png" /&gt;&lt;/p&gt;
&lt;p&gt;After uploading your files, you need to restart the Pico by selecting the
&lt;em&gt;Menu -&amp;gt; Run -&amp;gt; Send EOF / Soft-Reboot&lt;/em&gt;. Click on it and, the Pico
should restart.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Thonny Soft-Reboot" class="center" src="/assets/img/posts/pico/thonny_softreboot.png" /&gt;&lt;/p&gt;
&lt;p&gt;After rebooting, you should see a &lt;em&gt;connecting...&lt;/em&gt; on the screen, and after some
seconds, you should see your carbon intensity reading.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Pico connecting" src="/assets/img/posts/pico/pico_connecting.jpeg" /&gt;
&lt;img alt="Pico connected" src="/assets/img/posts/pico/pico_connected.jpeg" /&gt;&lt;/p&gt;
&lt;p&gt;That's it; you now have your own Carbon Intensity Monitor.&lt;/p&gt;
&lt;p&gt;For more information about the code, such as error codes, button functionality, etc., please go to the 
&lt;a href="https://github.com/mavcunha/pico2eq" target="_blank"&gt;pico2eq project&lt;/a&gt; on GitHub.&lt;/p&gt;
                </description>
                <published>2022-10-29T00:00:00.000Z</published>
            </item>
        
    
        
            <item>
                <title>This website's 5th gen release</title>
                <link>https://marcovaltas.com/2022/09/11/5th-gen-website.html</link>
                <description>
                    &lt;p&gt;This website went through another transformation. It began as a page on
&lt;a href="https://www.blogger.com" rel="external" target="_blank"&gt;Blogger&lt;/a&gt;, then went to
&lt;a href="https://www.wordpress.org" target="_blank"&gt;WordPress&lt;/a&gt;, to &lt;a href="/2013/02/06/hackeando-o-jekyll.html"&gt;Jekyll (post in
PT)&lt;/a&gt;, to my custom engine in
&lt;a href="https://clojure.org/" target="_blank"&gt;Clojure&lt;/a&gt;, and now in my custom
engine written in &lt;a href="https://python.org" target="_blank"&gt;Python&lt;/a&gt;. I'm
rewriting it again because I'm using more Python than Clojure these days. Also,
things started to break with the new releases of JVM.&lt;/p&gt;
&lt;h3&gt;Reduced page weight&lt;/h3&gt;
&lt;p&gt;Pages are slimmer now, partly by removing images I don't use anymore and by
removing Google Analytics from the website. This website has too little traffic
and no ads and does not cater to a particular audience. Which made me question
why having the analytics in the first place. Moreover, I use a browser
extension to block site trackers, so why do I have Google tracking on my
website?&lt;/p&gt;
&lt;p&gt;An excellent side effect of making the pages lighter is that they produce less
carbon. According to the &lt;a href="https://www.websitecarbon.com" target="_blank"&gt;Website Carbon
Calculator&lt;/a&gt;, the home page
went from &lt;strong&gt;0.06g&lt;/strong&gt; of CO2 to &lt;strong&gt;0.01g&lt;/strong&gt; of CO2 per visit. It still feels like a
lot, but it is better than 99% tested by the tool. I know that this is not an
impressive achievement for a small website, but what caught my attention was
that I could lower the emissions by a factor of 6.&lt;/p&gt;
&lt;h3&gt;Will the code for this blog engine be open-sourced?&lt;/h3&gt;
&lt;p&gt;That is a good question. Unfortunately, I'm not considering releasing the code.
Not because it has any secret sauces in it, just because it is not in a
releasable form. Since I'm a beginner in Python, the code is a bit messy, and
it has some hardcode stuff I'm not planning to extract into configurations.
Maybe in the future, if my Python improves, I can release it.&lt;/p&gt;
&lt;p&gt;There’s one thing I can share, though. Writing code in Python is delightful.
There is elegance and power in its simplicity.  Listed down is part of the code
I use to start a local HTTP server and rebuild the site if I change any file.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-python" data-lang="python"&gt;def preview():
    build_site()
    with PreviewServer.serve(4000) as httpd:
        try:
            log.info(&amp;quot;starting file watcher&amp;quot;)
            observer = Observer()
            observer.schedule(DirWatch(), str(RESOURCES_DIR), recursive=True)
            observer.schedule(DirWatch(), str(BLOG_ROOT_DIR.joinpath('layouts')), recursive=True)
            observer.start()

            log.info(&amp;quot;serving at localhost:4000&amp;quot;)
            httpd.serve_forever()
        except KeyboardInterrupt:
            log.info(&amp;quot;interrupted&amp;quot;)
            observer.stop()
            httpd.server_close()


class DirWatch(FileSystemEventHandler):
    &amp;quot;&amp;quot;&amp;quot;watch directory for changes, rebuild site if detects one&amp;quot;&amp;quot;&amp;quot;
    INTERVAL = 2  # interval in seconds for a rebuild
    TRIGGERED = time.time()  # track time between builds

    def on_modified(self, event):
        # several events are triggered for each change,
        # we ignore them for INTERVAL seconds
        if int(time.time() - self.TRIGGERED) &amp;gt; self.INTERVAL:
            log.info('rebuilding...')
            try:
                build_site()
            # do not stop because of an error
            # just wait for the next file change
            except BaseException as e:
                traceback.print_exception(e)
            self.TRIGGERED = time.time()
        else:
            pass
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;One external library is in use here,
&lt;a href="https://pypi.org/project/watchdog/" target="_blank"&gt;watchdog&lt;/a&gt;,
and the rest is out-of-the-box. There’s not much happening here; we serve our
pages from our build directory and watch for changes in the sources’
directories. If a change is detected, then we rebuild the site.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;I’m taking the opportunity of revamping this website and learn more Python,
which is a delight to write. You should try it too.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://xkcd.com/353/"&gt;&lt;img alt="XKCD Python" src="https://imgs.xkcd.com/comics/python.png" style="display: block; margin-left: auto; margin-right: auto;" /&gt;&lt;/a&gt;&lt;/p&gt;
                </description>
                <published>2022-09-11T00:00:00.000Z</published>
            </item>
        
    
        
            <item>
                <title>Project Euler script help</title>
                <link>https://marcovaltas.com/2021/02/21/project-euler-script-help.html</link>
                <description>
                    &lt;p&gt;During this pandemic we get bored. Staying at home prompted me to find
programming exercise routine. For years I know about &lt;a href="https://projecteuler.net/" target="_blank"&gt;Project
Euler&lt;/a&gt; but I never attempted myself. It is a series of
increasing difficult Math/Programming challenges which you answer one to get
to the next one. After you get the correct answer you might look at others answers in
the forum.&lt;/p&gt;
&lt;p&gt;It's a simple concept and a powerful one, given the years it has being active
the project has already seven hundred plus challenges. Which is definitely more
than I will be able to do in several months. Check it out if you want practice
our problem solving.&lt;/p&gt;
&lt;h2&gt;Helper script&lt;/h2&gt;
&lt;p&gt;Of course this was another opportunity to automate something thing out. I'd
guess that most attempt to solve the problems in one programming language. In
my case I saw the opportunity to also practice languages I already know and
ones I want to learn.&lt;/p&gt;
&lt;p&gt;Adding new languages presents a problem, you got to run the solution for all of
them. You need to keep track of how your run, the ones that you already solved
and etc. So I made a &lt;code&gt;zsh&lt;/code&gt; script that helps you on that.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mavcunha/euler" target="_blank"&gt;Euler&lt;/a&gt; is a simple script that given a
certain configuration will run exercises in the languages you defined. Here's
how it looks like if you run for a simple &lt;code&gt;Hello World!&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://asciinema.org/a/392854"&gt;&lt;img alt="asciicast" src="https://asciinema.org/a/392854.svg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There are more options which allow you to run an specific language, show the
solution instead of running and so on. Please check the
&lt;a href="https://github.com/mavcunha/euler/blob/main/README.md" target="_blank"&gt;README&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By default, or the languages I'm working on, are: Clojure, Wolfram Language,
Lua, Java, SQL, Zsh, Ruby, Raku and Python. You can add or remove as many as
you like.&lt;/p&gt;
                </description>
                <published>2021-02-21T00:00:00.000Z</published>
            </item>
        
    
        
            <item>
                <title>Birr - Simple URL shortening using WSGI</title>
                <link>https://marcovaltas.com/2019/11/28/birr-simple-url-shortening-using-wsgi.html</link>
                <description>
                    &lt;p&gt;For sometime I used several of the &lt;a href="https://en.wikipedia.org/wiki/URL_shortening" target="_blank"&gt;URL shortening
services&lt;/a&gt;, while useful
I rarely used them for a long lasting web link. Most will charge
you for a mnemonic redirection and there's always the lack of control
of the hosting, analytics and so on.&lt;/p&gt;
&lt;p&gt;So I decided to write my own and &lt;a href="https://mvaltas.com/birr" target="_blank"&gt;Birr&lt;/a&gt; was created.
It is a very simple redirection code written in Python which takes a
configuration file and redirects a URL into another. Check it out in
&lt;a href="https://mvaltas.com/birr" target="_blank"&gt;https://mvaltas.com/birr&lt;/a&gt;.&lt;/p&gt;
                </description>
                <published>2019-11-28T00:00:00.000Z</published>
            </item>
        
    
        
            <item>
                <title>2018 a year of bureaucracy learning</title>
                <link>https://marcovaltas.com/2019/05/05/2018-learning-bureaucracy.html</link>
                <description>
                    &lt;p&gt;If you ever visit to this blog more than once a year you notice that not much
happened here in 2018. The truth is that a lot happened and because of that I
was unable to write. In a nutshell we moved to the US. And to get here was a
year of planning and executing different things from getting the VISAs to
research about the public school system.&lt;/p&gt;
&lt;p&gt;Here's a list of topics I learned about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Deductables&lt;/em&gt; in health insurance&lt;/li&gt;
&lt;li&gt;Flexible Spending Account (FSA) and/or Health Savings Account (HSA)&lt;/li&gt;
&lt;li&gt;W-4 form and W-2 forms&lt;/li&gt;
&lt;li&gt;401(k) savings program&lt;/li&gt;
&lt;li&gt;Credit Rating (FICO) / Secure Credit Cards&lt;/li&gt;
&lt;li&gt;Zelle and/or different ways to electronically transfer money&lt;/li&gt;
&lt;li&gt;Cashier's Check / Money Order&lt;/li&gt;
&lt;li&gt;Social Security Number (SSN)&lt;/li&gt;
&lt;li&gt;Public school enrollment rules and processes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This list is what comes to mind when I think about the differences between
Brazil and US. Truth to be told these are not of unattainable understanding and
certainly there are parallels between the two countries bureaucracy. It just
that you do not think much about it until all names change and you need a
refresh course on all.&lt;/p&gt;
&lt;p&gt;Cheers.&lt;/p&gt;
                </description>
                <published>2019-05-05T00:00:00.000Z</published>
            </item>
        
    
        
            <item>
                <title>Nothing like a bee sting to get you moving</title>
                <link>https://marcovaltas.com/2017/12/11/nothing-like-a-bee-sting.html</link>
                <description>
                    &lt;p&gt;Writing this post fees like cheating, I’ll tell you why in a few lines.
Sometime ago somewhere I heard about &lt;a href="https://www.beeminder.com/" title="Beeminder"&gt;Beeminder&lt;/a&gt;,
but never had courage to use it. This changed a couple weeks ago
after an unfortunate online psychological quiz that told me I work best when
held accountable.&lt;/p&gt;
&lt;p&gt;I’m an honest procrastinator, by honest I mean I know what I am and I’m always
working to mitigate the problems caused by it. I keep revising goals,
maintaining tasks lists, alerts, checklists, ... but one ingredient was
missing; of all methods I use none hold me accountable if I fail, but Beeminder
can.&lt;/p&gt;
&lt;p&gt;For those who don’t known what Beeminder is I will sum it up. Set a goal,
commit money to reach it and track it. There’s two possibilities after this or
you meet your goal or you do not. If you accomplish what you set out to do you
are fine, if not, the money goes away the committed amount rises and the cycle
restarts. Sounds tough?&lt;/p&gt;
&lt;p&gt;Let’s check, this is my progress chart on blogging from Beeminder.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Beeminder Blogging" src="/assets/img/posts/beeminder-blogging.png" /&gt;&lt;/p&gt;
&lt;p&gt;After analyze this chart you’ll see I’m on the hook to publish a post on my
blog or I lose ten bucks. And that’s why this post feels like cheating. But
this post is the whole point.&lt;/p&gt;
&lt;p&gt;When I mention to colleagues about it most of them tremble with the thought of
losing money by not fulfilling self-imposed commitment. I relate to that as
this was my reaction when I heard about Beeminder. But as the more I think
about this the more this fear of commitment makes little sense. Why should us
be afraid of pursuing our own goals? What drives us to assume we have no
control? If not by thoughts like this, the fear of committing is unjustified.
I leave you to think about it as I’m thinking about this too.&lt;/p&gt;
&lt;p&gt;Cheers.&lt;/p&gt;
                </description>
                <published>2017-12-11T00:00:00.000Z</published>
            </item>
        
    
        
            <item>
                <title>Magic Quality Gates</title>
                <link>https://marcovaltas.com/2017/11/24/magic-quality-gates.html</link>
                <description>
                    &lt;p&gt;&lt;em&gt;How much quality is enough?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is a tricky question, sounds like we can find a storage to pick quality amounts until we get enough. We know this is not it, still we struggle to talk about software quality in the context of its development, and the struggle leads  companies to create magic quality gates to protect themselves. &lt;/p&gt;
&lt;p&gt;A quality gate is something that somehow decides if the software is worth to go to production.&lt;sup id="fnref:1"&gt;&lt;a class="footnote-ref" href="#fn:1"&gt;1&lt;/a&gt;&lt;/sup&gt; Test coverage is a classic number from where to build a quality gate. High quality software usually has high test coverage, but the catch is that  coverage is a necessary but not sufficient condition to high quality. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“Testing shows the presence, not the absence of bugs.” Dijkstra (1969)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Coverage makes a bad gate. Just a quick math on the amount of conditions and combinations of inputs and states in a piece of software should be enough to discourage testing everything. Even a 100% coverage is a line execution metric and not all combinations were tested. &lt;/p&gt;
&lt;p&gt;Someone somewhere in your company had an epiphany and uttered:  &lt;em&gt;“Software created here should have no less than 80% test coverage.”&lt;/em&gt;  What about the 20% left untested? It can fail? And what if in this 20% there’s a crucial piece of code? You get the idea and also &lt;a href="https://team-coder.com/test-coverage/" title="The Problem with High Test coverage"&gt;check this post&lt;/a&gt; for more discussion on test coverage. No magic creates correlation that does not exist, such incantations result in &lt;a href="https://insightmaker.com/insight/34820/Rule-Beating-Trap" title="Model of Rule Beating on Software Development Tests"&gt;rule beating&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What’s happening is that people worried about software quality want to solve this problem exclusively in the domain of software development. Meanwhile the quality manifests itself in live working software. Without observing the software in its running environment there’s so much information we can obtain.&lt;/p&gt;
&lt;p&gt;For that you need DevOps. No, you can’t buy it or create from nothing. You need to engage in practices which will approach the development people to the operations people and from this mix DevOps happens. Unless DevOps manifests itself through &lt;strong&gt;collaboration&lt;/strong&gt; of development and operations, the quality of your software will be suboptimal. Start by &lt;a href="https://codeascraft.com/2011/02/15/measure-anything-measure-everything/" title="Measuring Anything, Measure Everything"&gt;measuring anything and everything&lt;/a&gt; and cultivate a curiosity for &lt;a href="https://events.itrevolution.com/devops-resources/metrics"&gt;a lot of other interesting metrics&lt;/a&gt; which helps operations and development to find ways to improve quality. &lt;/p&gt;
&lt;p&gt;The gates should be self-imposed by the teams from metrics that matter to them. Not by some general rule disregarding the context in which the software will be created and run.  &lt;/p&gt;
&lt;p&gt;Returning to our first question &lt;em&gt;”How much quality is enough?”&lt;/em&gt; The only answer is: the most we can get in &lt;a href="http://fastgood.cheap/"&gt;this context&lt;/a&gt;. There are &lt;a href="https://martinfowler.com/articles/continuousIntegration.html"&gt;practices&lt;/a&gt; &lt;a href="http://www.extremeprogramming.org/"&gt;which&lt;/a&gt; &lt;a href="https://continuousdelivery.com/"&gt;improve&lt;/a&gt; &lt;a href="https://newrelic.com/devops/what-is-devops"&gt;the&lt;/a&gt; &lt;a href="https://www.thoughtworks.com/insights/blog/infrastructure-code-reason-smile"&gt;quality&lt;/a&gt;, or better, the &lt;a href="https://www.amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530"&gt;absence&lt;/a&gt; of &lt;a href="https://martinfowler.com/books/refactoring.html"&gt;problems&lt;/a&gt; in &lt;a href="https://en.wikipedia.org/wiki/Lean_software_development"&gt;software&lt;/a&gt;. But there’s no magic number from which &lt;em&gt;enough quality&lt;/em&gt; magic gates can be built.&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Build pipelines are quality gates created by the  team. These “magic gates” are outside of the team’s control.&amp;#160;&lt;a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
                </description>
                <published>2017-11-24T00:00:00.000Z</published>
            </item>
        
    
        
            <item>
                <title>On boarding new team members</title>
                <link>https://marcovaltas.com/2017/11/18/on-boarding-new-team-members.html</link>
                <description>
                    &lt;p&gt;Teams change and Software Development Teams are no different. When this change is about bringing someone new to the team, we call this process an on-boarding. This process involves tasks to integrate this person to the team and the project, but misconceptions and unrealistic expectations make this process challenging for the new person and for the team itself. &lt;/p&gt;
&lt;p&gt;Belief newcomers manage alone a successful on-boarding creates these misconceptions. Some teams spend time with the new person presenting topics and instructions; but deep down the belief remains. “We need a fast learner, are you one?”, “We are in stressful times; we will need you to be productive right away,” “Here is the code and docs, ping me if you have any doubt,” and so on; these phrases reveal who in fact is responsible for a successful on-boarding.&lt;/p&gt;
&lt;p&gt;A view which promotes certain indoctrination must occur before new teammates can help. An on-boarding period, “He’ll be on-boarding next two weeks,” is also a bad sign; it makes people ignore the newcomer for the next two weeks. A waste for a good opportunity for the team.&lt;/p&gt;
&lt;h2&gt;The team is accountable for the on-boarding&lt;/h2&gt;
&lt;p&gt;A cascade effect happens when the team assumes an accountable position. Documentation, if exists, needs to be effective to explain how the application works and why it works like that. Tools for automation need a “—help” option. Understanding of domain concepts need to be clear to all. And the team must ensure everyone can explain the project to anyone.&lt;/p&gt;
&lt;p&gt;Software Development Teams need to develop teaching capabilities. The problems they solve as a group need to be communicated in different levels of abstraction and details. Project progress, challenges, negotiations with other teams, and finally the on-boarding of new members will benefit if the team knows how to teach. And the best way to learn and perfect these capabilities is to practice them.&lt;/p&gt;
&lt;h2&gt;New team member collaboration from start&lt;/h2&gt;
&lt;p&gt;Someone new paying attention to what the team has to teach is a golden opportunity. Did this person understood what this project is about in the first few hours? Can any team member answer a basic question about the project? Commitment to understand the project is an excellent counter measure to the &lt;a href="https://en.wikipedia.org/wiki/Curse_of_knowledge"&gt;Curse of Knowledge&lt;/a&gt;; forgetting how is to not know something once you already know it. Here is an incomplete list of things a new person on the team can help from start:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a safe environment for learning&lt;/li&gt;
&lt;li&gt;Review the software architecture&lt;/li&gt;
&lt;li&gt;Train business analysts and team members to explain the business&lt;/li&gt;
&lt;li&gt;Review documentation&lt;/li&gt;
&lt;li&gt;Domain design&lt;/li&gt;
&lt;li&gt;Identify gaps on path to production knowledge and process&lt;/li&gt;
&lt;li&gt;Improve automation tools&lt;/li&gt;
&lt;li&gt;Improve secret sharing and revocation&lt;/li&gt;
&lt;li&gt;Exercise presentation skills (creating and presenting)&lt;/li&gt;
&lt;li&gt;Review tests and pipeline for clarity&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Setting it up&lt;/h2&gt;
&lt;p&gt;To work the new person needs a safe environment on which to ask questions and know, as simple these might be, are expected. Creating the safe environment is crucial for this to work, if someone feels insecure they will refrain from asking questions, communicate failure in understanding, and other behaviors that hinder a successful on-boarding.&lt;/p&gt;
&lt;p&gt;Assessments on the on-boarding process should be done through measuring outcomes and not pure definition know ledge. Often on-boarding spreadsheets list topics such as “Know what is X,” “Know what is Y,” “Do Z,” “Do W,”  and variations. These measurements can be improved by assessing abilities and not just definitions and repetitions. Examples “Can deploy head to production.” “Can destroy and recreate local environment.” Abilities are more decoupled from tools, last longer, and can drive the improvements the team want to focus on.&lt;/p&gt;
&lt;p&gt;To ensure team members perform all tasks during the on-boarding is good to track these tasks and rotate individuals on each on-boarding. Always bring the newest on the team to help.&lt;/p&gt;
                </description>
                <published>2017-11-18T00:00:00.000Z</published>
            </item>
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
  </channel>
</rss>