<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Diplomats can code too! (Posts about engineering)</title><link>https://wintermade.it/blog/</link><description></description><atom:link href="https://wintermade.it/blog/categories/engineering.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><lastBuildDate>Sat, 05 Oct 2019 08:14:28 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>About "Programmer as wizard, programmer as engineer"</title><link>https://wintermade.it/blog/posts/about-programmer-as-wizard-programmer-as-engineer.html</link><dc:creator>Alessandro Balzano</dc:creator><description>&lt;div class="section" id="programmer-as-wizard-programmer-as-engineer"&gt;
&lt;h2&gt;Programmer as wizard, programmer as engineer&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.tedinski.com/2018/03/20/wizarding-vs-engineering.html"&gt;Programmer as wizard, programmer as engineer - Tedinski.com&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
We have different design goals and constraints when we’re doing one [wizarding] or the other [engineering].
With engineering, we’re tasked with the long term maintenance of a piece of software, and we also
become concerned with many lower-priority properties, such as its performance.
With wizarding, we’re often best served by designing for ease of throwing code away rather than
maintaining it. Well-engineered code is irreplaceable, but well-cast spells should be transient.&lt;/blockquote&gt;
&lt;p&gt;In this post, Ted Kaminski talks about two different styles of programming:
&lt;strong&gt;wizarding&lt;/strong&gt; and &lt;strong&gt;engineering&lt;/strong&gt;. At first, all startup prototypes/Minimum Viable Products
are created as fast as possible: we need to see if our startup idea is viable first.
If the business grows, the developers need to transform this prototype to a stable
product, able to grow and include new features.
Developers need to shift from the &lt;em&gt;wizarding&lt;/em&gt; attitude (everything is temporary)
to an &lt;em&gt;engineering&lt;/em&gt; mindset (long term maintenance, the software needs to work for a long time and is used
by many users).&lt;/p&gt;
&lt;p&gt;These two "styles" -and the transition between them- reminds me of
the &lt;a class="reference external" href="https://dev.to/corgibytes/developer-differences-makers-vs-menders"&gt;Makers vs Menders&lt;/a&gt; difference. A Maker is a developer who love to create
stuff quickly and are excited by deadlines and time pressures.
On the other hand, a Mender likes older codebases, is satisfied by fixing longstanding bugs
and making the whole system more stable and more secure.&lt;/p&gt;
&lt;p&gt;How do we do switch from one style to the other, though?
The author suggests we should write enough tests to be sure everything is working,
separate big applications into microservices when it makes sense,
and rewrite critical parts of your system in languages that can offer static (or gradual) typing
and good tooling.&lt;/p&gt;
&lt;p&gt;Separating concerns into their own services -when it makes sense and does not lead to
a &lt;a class="reference external" href="https://www.simplethread.com/youre-not-actually-building-microservices/"&gt;distributed monolith&lt;/a&gt;- can help reason about the system as a whole, and making
each service faster and more stable, especially when paired with the right dose of testing.&lt;/p&gt;
&lt;p&gt;I'm also a fan of static languages such as Rust (even &lt;a class="reference external" href="https://wintermade.it/blog/posts/rust-and-webassembly-what-i-learnt-from-porting-hrm-interpreter-to-wasm.html"&gt;in the browser!&lt;/a&gt;), that can
feature good tools such as &lt;em&gt;cargo&lt;/em&gt;, and an expressive language that helps developers
implement critical systems with fewer errors.&lt;/p&gt;
&lt;p&gt;I'd also like to suggest to &lt;strong&gt;recognize when the project should move from wizarding to engineering&lt;/strong&gt;.
Failure to understand &lt;strong&gt;when&lt;/strong&gt; the project needs to transition to the &lt;em&gt;engineering&lt;/em&gt; state, and plan for it,
is probably the most unappreciated problem I encountered in my career so far.
If the team can't slow down and fix growing pains, they will only get stronger and mutate into
outages, and the team won't stop firefighting production issues.
My suggestion is to keep note of small issues, or tasks that are taking longer than expected
for technical reasons, and expose them during a retrospective. Having senior engineers
in the team also helps, especially if they are experienced with the project's technology stack.&lt;/p&gt;
&lt;hr class="docutils"&gt;
&lt;p&gt;So, I hope you liked the first post of &lt;strong&gt;Interesting Links&lt;/strong&gt;, a new column
where I highlight interesting articles, with my own comments and thoughts.
If you liked this post, you should totally share it on &lt;a class="reference external" href="https://twitter.com/alfateam123"&gt;Twitter&lt;/a&gt;, or support me on &lt;a class="reference external" href="https://www.ko-fi.com/alessandrobalzano"&gt;Ko-fi&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;</description><category>engineering</category><guid>https://wintermade.it/blog/posts/about-programmer-as-wizard-programmer-as-engineer.html</guid><pubDate>Sun, 06 Jan 2019 18:55:40 GMT</pubDate></item></channel></rss>