<?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>Nando Florestan's blog (Posts about programming)</title><link>https://read.nando.audio/</link><description></description><atom:link href="https://read.nando.audio/categories/programming.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 &lt;a href="mailto:nandoflorestan+read@gmail.com"&gt;Nando Florestan&lt;/a&gt; </copyright><lastBuildDate>Sat, 07 Mar 2026 00:41:39 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Revising the output of a coding assistant</title><link>https://read.nando.audio/posts/revising-the-output-of-a-coding-assistant.html</link><dc:creator>Nando Florestan</dc:creator><description>&lt;p&gt;Although I am sure using coding assistants today is bad for you, I have been trying them out.
I think it's because even our hero Kent Beck is trying them out, so I have to be open to a change of opinion.&lt;/p&gt;
&lt;p&gt;Here's something that happened, and is typical.&lt;/p&gt;
&lt;p&gt;I told it to create a command to create a user. I told it the command must be idempotent.&lt;/p&gt;
&lt;p&gt;It output this:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;# This command is idempotent in the sense that,&lt;/span&gt;
&lt;span class="c1"&gt;# if the user exists, it will fail gracefully:&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"Add user &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;register_cmd&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; || echo 'User might already exist or command failed'"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The above uses &lt;a href="https://pyinfra.com/"&gt;pyinfra&lt;/a&gt;, an awesome Python library that obsoletes infrastructure-as-code solutions such as Ansible.&lt;/p&gt;
&lt;p&gt;Margaret Boden divides creativity in 3 general types: combinatorial, exploratory and transformative.
I notice that the output here shows combinatorial creativity coming from the AI.
It combined its repertoire of shell usage with some Python in an attempt to satisfy my idempotency requirement.
The solution is wrong, but I think it is mildly creative.&lt;/p&gt;
&lt;p&gt;Notice the comment: "it will fail gracefully". That is only a half-truth.
The whole truth is, the &lt;em&gt;or&lt;/em&gt; converts every kind of failure into a success:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The user already exists?  'User might already exist or command failed'&lt;/li&gt;
&lt;li&gt;The command is not present in the target machine? 'User might already exist or command failed'&lt;/li&gt;
&lt;li&gt;Could not connect to the database? 'User might already exist or command failed'&lt;/li&gt;
&lt;li&gt;Out of memory? 'User might already exist or command failed'&lt;/li&gt;
&lt;li&gt;(...)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I used a model that doesn't search the web, and the training data probably didn't have much about pyinfra.
Certainly unaware of how the command works, it tried to ensure idempotency through a trick.&lt;/p&gt;
&lt;p&gt;So I had to look up the documentation and commit a correction:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;    &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;register_cmd&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; --exists-ok"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The above adds an argument that the command already has, that makes it idempotent.&lt;/p&gt;
&lt;p&gt;So what a human really wants from a pair programming partner here is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;for the driver to ask the helper (me), "can you please look up the arguments to this function?"&lt;/li&gt;
&lt;li&gt;instead of vomiting an inadequate solution and not even warning me.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All current LLMs (2026-03) have this bad behavior – they try to finish the project right now instead of interviewing me – even if I prompt them to not allow any assumptions to go unchecked.&lt;/p&gt;
&lt;p&gt;There's a second problem: pyinfra will, by default, not show either the output of the command or the &lt;code&gt;echo&lt;/code&gt; message, it will hide them.
The LLM here really knows nothing about pyinfra.
For brevity, I omit the solution to this.&lt;/p&gt;
&lt;p&gt;Now examine all my steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create my augmented code setup,&lt;/li&gt;
&lt;li&gt;Write a prompt,&lt;/li&gt;
&lt;li&gt;Pay for an LLM that pollutes and is currently subsidized and will soon get 10-15x more expensive,&lt;/li&gt;
&lt;li&gt;Review the code, find and understand the problem,&lt;/li&gt;
&lt;li&gt;Look up the documentation,&lt;/li&gt;
&lt;li&gt;Write code,&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Commit it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Steps 0, 1 and 2 are the ones necessary to use an LLM.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Steps 4, 5 and 6 are the steps it should have done for me.&lt;/li&gt;
&lt;li&gt;Step 3 would be unnecessary in an ideal world, but we'll probably never get there. Someone has to be responsible and sign off on the code, because LLMs cannot be trusted with any decisions.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If I had simply done steps 4, 5 and 6, in this case,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I would have finished much sooner.&lt;/li&gt;
&lt;li&gt;I would have skipped 2 bugs in 6 lines of code or less.&lt;/li&gt;
&lt;li&gt;I would have read a bit of the documentation, improving my memory of it and my ability to find it in the future.&lt;/li&gt;
&lt;li&gt;I would have exercised my coding chops, which is as essential to building up my architecture ability and my software engineering ability as practicing the piano is to improving my musical skills and interpretation skills.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Writing code is a creative and pleasant activity that teaches you, makes you grow.
Reviewing code is a tiresome, difficult, arid activity that teaches you nothing, but also depends on you having written a lot of code in the past.
Nobody can be taught to review code, they can only be taught how to code.&lt;/p&gt;
&lt;p&gt;If I stop writing code and become only a reviewer, this will certainly hurt my skills.
But that is exactly what working with a coding assistant is.&lt;/p&gt;
&lt;p&gt;Code reviews also do not work, beyond a very low quantity of lines of code.
I have explained this in the past.&lt;/p&gt;
&lt;p&gt;I am seeing a lot of programmers say that working in this way is exhausting.
I think my example shows how.&lt;/p&gt;
&lt;p&gt;Now, a critic might point out that I didn't use one of the most expensive models, the ones that can search the web.
They might have answered correctly.
But if you are being honest, you know that is not the point here.
This small example is good enough as a placeholder for the kinds of mistakes that LLMs commit, such as working around problems in the wrong layer of abstraction (as it kinda did here).&lt;/p&gt;
&lt;p&gt;In the awesome lecture &lt;a href="https://www.youtube.com/watch?v=DZpR0GojoWQ"&gt;"The dangers of probably-working software"&lt;/a&gt;, the main point is "if you don't know how it works, you don't know it works".
Had I been lazy and not paid attention to the output, the problem would still be there.&lt;/p&gt;
&lt;p&gt;That is a Github employee – you know, the guys selling you CoPilot – brilliantly explaining that, if you don't review everything CoPilot writes for you – if you don't understand the code in your project to the point that it is yours – you cannot trust that code.&lt;/p&gt;
&lt;p&gt;An organization does not need code written, it needs code understood.&lt;/p&gt;
&lt;p&gt;Much beyond what is demonstrated in this example, LLMs make implicit design decisions in their code, which are usually bad, and never discussed or made explicit to you in any way.&lt;/p&gt;
&lt;p&gt;So using a coding assistant becomes a futile exercise in trying to control (specify in the prompt) every single design decision, or sometimes just running the prompt again until something good comes out.
In any case, you become a control freak.&lt;/p&gt;
&lt;p&gt;But senior programmers have an intuition about code, they get the design right sooner.
This intuition is more than a little different from a conscious enumeration of all the design decisions involved.&lt;/p&gt;
&lt;p&gt;Even if you see the AI's implicit design decisions hidden in the code, they are a great opportunity for laziness to make our lives more difficult.
In this specific project, the AI came up with a directory structure for the deployment, and I said "fine".
I only realized how horrible it was, and how difficult to navigate and understand it was, in the middle of the project, when a refactoring became necessary to fix the issue.
This refactoring involved a lot of files, it was unpleasant and a bit risky.
I really wish I had spent some time designing the directory structure myself.&lt;/p&gt;
&lt;p&gt;Laziness is a very difficult thing for humans to suppress, and no matter how disciplined I am as a programmer, I know my laziness will eventually hurt things again.&lt;/p&gt;
&lt;p&gt;In short, the more you give the reigns to the AI, the worse for your project.&lt;/p&gt;
&lt;p&gt;Ah! One more thing. If you are pairing with a robot, you are probably not pairing with a human.&lt;/p&gt;
&lt;p&gt;In conclusion, both from a philosophical/educational stance and from practical usage, I continue to believe &lt;strong&gt;using LLMs to produce code is hurtful to your project, to your real speed, to your wallet, to your organization, to our energy consumption, to the environment, to the economy, to your skills, to your memory, to your patience, to your team and social skills, to your loneliness and sense of alienation, and to software engineering as a whole.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This technology enables developers to, irresponsibly, quietly quit, producing tons of instantaneous legacy code that is impossible to maintain, while clueless managers push for more and more of the same, thinking it's the New True Way.&lt;/p&gt;
&lt;p&gt;It remains theoretically possible to code with an assistant in such a way that you gain more than you lose, but in practice, it's so hard to see how, and I think it requires such a senior and disciplined programmer to figure that out, that it's clearly not worth it.&lt;/p&gt;
&lt;p&gt;But I am just an average schmuck.
I invite you to hear a successful programmer/entrepreneur/philosopher small genius saying similar things: &lt;a href="https://www.youtube.com/watch?v=dHBEQ-Ryo24"&gt;The dangerous illusion of AI coding&lt;/a&gt;.&lt;/p&gt;</description><category>computing</category><category>programming</category><guid>https://read.nando.audio/posts/revising-the-output-of-a-coding-assistant.html</guid><pubDate>Fri, 06 Mar 2026 22:08:49 GMT</pubDate></item><item><title>The new employee</title><link>https://read.nando.audio/posts/new-employee.html</link><dc:creator>Nando Florestan</dc:creator><description>&lt;p&gt;"Yeah, it was a very nice vacation", said Long Johnson, the Asian-American manager.
"How have things been here? Everything going well?"&lt;/p&gt;
&lt;p&gt;"We need to talk about Agapito Hackerman", replied Pascal Devoto, the lead developer.&lt;/p&gt;
&lt;p&gt;"What about him?", asked Long.&lt;/p&gt;
&lt;p&gt;Agapito Hackerman had been hired 2 months ago.
On that day, everyone in the team had marveled at his typing speed.
He'd brought his own mechanical keyboard and he had a pair of mysterious electrical gloves.
With that equipment and his training, he was able to type at Guinness World Record speeds.&lt;/p&gt;
&lt;p&gt;"He types fast. That's all the good things we can say about his work".&lt;/p&gt;
&lt;p&gt;"We?"&lt;/p&gt;
&lt;p&gt;"The entire development team has discussed this.
We are all behind what I am about to tell you."&lt;/p&gt;
&lt;p&gt;"Okay, I'm listening."&lt;/p&gt;
&lt;p&gt;Pascal looked to the side – he did not want to do this.
Inadvertently, he saw a poster on the meeting room wall. White on blue.
"You are more than", followed by a bunch of scattered options: "a coder / a designer / an analyst"...&lt;/p&gt;
&lt;p&gt;"Look, to start with, the quality of his code is extremely mid".&lt;/p&gt;
&lt;p&gt;"Mid?"&lt;/p&gt;
&lt;p&gt;"Just meh code."&lt;/p&gt;
&lt;p&gt;"Okay. You mean ravioli?"&lt;/p&gt;
&lt;p&gt;"Um, no, not spaghetti code, no.
It's a different problem.
It's like his code is always... default.
He knows about code architecture, but he constantly assumes we have needs we don't have, and ignores the needs we actually have.
So the architecture in his code is never the right one.
And he can only do easy tasks.
I have tried giving him harder problems a couple times, but... I don't know... it's as if he could only solve problems that he has seen solved before."&lt;/p&gt;
&lt;p&gt;Pascal took a breath and continued:&lt;/p&gt;
&lt;p&gt;"His code is so meh that I wonder where he learned programming."&lt;/p&gt;
&lt;p&gt;"Wait, I still have his CV here." Johnson opened his drawer and found it.
While he read, he took a sip of his smoothie, labeled &lt;em&gt;Cacao-Empathy&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;"Hackerman went to the Microsoft Academy."&lt;/p&gt;
&lt;p&gt;"Figures", said Pascal.
"And Microsoft pushed you to hire him."&lt;/p&gt;
&lt;p&gt;"Well, yeah.
I listen to them.
They are huge."&lt;/p&gt;
&lt;p&gt;"But you know I have been trying to build a team that writes code of great quality.
You know how important this is for the future of the product."&lt;/p&gt;
&lt;p&gt;"Yes, but you have hired mid programmers before."&lt;/p&gt;
&lt;p&gt;"True. By giving them time and a learning environment, they have improved and progressed from junior to senior levels.
But you remember Andrzej.
He just wasn't interested in software architecture, and ultimately I couldn't keep him on the team.
That's much, much worse with Agapito."&lt;/p&gt;
&lt;p&gt;"How come?"&lt;/p&gt;
&lt;p&gt;"He does not seem either able or open to receive lessons."&lt;/p&gt;
&lt;p&gt;"I find that hard to believe.
You remember how much he was recommended to us."&lt;/p&gt;
&lt;p&gt;"Look, Long.
Even with his problems, the potential seemed high at first.
But we have tried teaching him things.
On the next day he appears to have forgotten everything he was taught.
At first we wondered if he was a jerk.
Now we assume he has some kind of condition.
He forgets all kinds of information, too.
Even what it is that the product does.
All facts seem to be gone in the next conversation.
This company should insist he go to a head doctor, and pay for it."&lt;/p&gt;
&lt;p&gt;"Really?"&lt;/p&gt;
&lt;p&gt;"And his interactions with the rest of the team are very limited.
He doesn't even know anyone's name.
Including yours."&lt;/p&gt;
&lt;p&gt;"Are you sure you guys don't just envy his speed?
I mean, I like how productive he is."&lt;/p&gt;
&lt;p&gt;Pascal sighed.&lt;/p&gt;
&lt;p&gt;"Long, you are not listening to me!
He types quickly, but the rest of the team must correct everything he does.
And if we don't, we'll have awful code, and what's worse, oceans of it."&lt;/p&gt;
&lt;p&gt;"I don't know about code quality, I cannot evaluate that...
But I see the stats. His productivity is way higher than everyone else's."&lt;/p&gt;
&lt;p&gt;"No, it is not. Writing the wrong code isn't productivity.
You know, he suddenly uses libraries we don't use here.
I have often had to remind him we use Flutter, not React.
No matter how much I teach him about dependency management, he seems to just use any library out there.
But it gets worse!"&lt;/p&gt;
&lt;p&gt;Pascal was gesticulating:&lt;/p&gt;
&lt;p&gt;"You'd think he knows hundreds of libraries, but he doesn't know any one of them well.
He doesn't know their API – but instead of looking up the documentation, he types the code immediately, as if he remembered every detail!
Long, he writes against a fictitious API!!!
He thinks he remembers, but what he remembers is a hallucination!
Then he commits the code and creates a pull request.
The PR is immediately failing because Agapito doesn't even run the automated tests."&lt;/p&gt;
&lt;p&gt;Pascal gasped:&lt;/p&gt;
&lt;p&gt;"It gets even worse. I don't think he compiles his own code, even.
We have found syntax errors in his PRs."&lt;/p&gt;
&lt;p&gt;"Okay, so you tell him to fix the problem, right?"&lt;/p&gt;
&lt;p&gt;"Of course. You know what he does?"&lt;/p&gt;
&lt;p&gt;"What?"&lt;/p&gt;
&lt;p&gt;Pascal got up and started walking back and forth.&lt;/p&gt;
&lt;p&gt;"He doesn't read his own code!
He types the entire thing again, from scratch.
Instead of a little correction, we get a new program!
The diff is unreadable, nobody can make sense of the changes!
All previously done analysis is wasted.
He might have solved one problem and created three more.
And the problems could be security vulnerabilities!"&lt;/p&gt;
&lt;p&gt;"Maybe that's a price of typing as fast as he does?"&lt;/p&gt;
&lt;p&gt;"I don't know.
But it's insane.
It has affected my work.
I am behind in everything I do.
I don't even write code myself anymore, I have to baby-sit Agapito all the time!"&lt;/p&gt;
&lt;p&gt;Pascal stopped in the middle of the meeting room and continued:&lt;/p&gt;
&lt;p&gt;"Long, it's fair to say the guy is an impostor.
The entire team is talking ill behind his back.
We've never had this kind of problem before."&lt;/p&gt;
&lt;p&gt;"Okay, but maybe that's not such a bad thing.
If you can remind him of everything he needs to do, he will type everything out for you real fast, if I understand you correctly.
Why don't you start a checklist of the things you typically need to tell him?"&lt;/p&gt;
&lt;p&gt;"That's an insane way to work. But I am glad you thought of that. Here is the checklist.
Gradually built over two months."&lt;/p&gt;
&lt;p&gt;Pascal took 40-plus pages out of the printer and placed them on Johnson's desk.
He wanted to throw them, but he placed them.&lt;/p&gt;
&lt;p&gt;Johnson took a cursory look at the long document.
All kinds of information about the company, the product, the kinds of users, their roles, the current code, the future the team aimed at.&lt;/p&gt;
&lt;p&gt;"Every time I give Agapito a new assignment, I tell him to read that first.
But he always manages to forget something important from it."&lt;/p&gt;
&lt;p&gt;"But this is good work, Pascal.
Looks like a great summary of everything about this company.
This text could be used as a basis for so many things.
I may start sending this to whoever doesn't yet understand what we do."&lt;/p&gt;
&lt;p&gt;"Okay, Long.
But it's not normal for a team member to be so... absent.
You know Agapito refuses to attend team meetings?
And he doesn't do anything during the meetings, either.
He just sits there, waiting.
He only works in short bursts, when asked to work.
I have never worked with anyone so strange in my entire life.
The team has given up any hope of Agapito ever learning anything from us, about ourselves, about the company, about our customers, about the work itself..."&lt;/p&gt;
&lt;p&gt;Johnson glanced at the glass-walled office where Hackerman was sitting in front of his desk.
Like a statue.&lt;/p&gt;
&lt;p&gt;"Okay, but still, can the team adapt to working with Hackerman?"&lt;/p&gt;
&lt;p&gt;Pascal touched his forehead with all his fingertips.&lt;/p&gt;
&lt;p&gt;"That is the wrong question to ask, Long!
We are talking about a dev that is unable to adapt to us in the slightest!
We were doing fine before, but now the entire team is dedicated to finding his mistakes and fixing them!"&lt;/p&gt;
&lt;p&gt;Pascal's expression was a painful grimace.
"Jesus H. Christ, Long, we all know how to type!"&lt;/p&gt;
&lt;p&gt;Johnson seemed a little shocked that Pascal was almost yelling.&lt;/p&gt;
&lt;p&gt;"Agapito never has any questions!
He never asks for clarifications.
He never asks the opinion of any team member.
He either understands the briefing and the briefing is... inhumanly complete, or chaos ensues."&lt;/p&gt;
&lt;p&gt;Johnson was trying to interrupt and now he got this in:&lt;/p&gt;
&lt;p&gt;"Wait, Pascal, have you talked to him?"&lt;/p&gt;
&lt;p&gt;"Of course I have, Johnson!
You know what happened?
He politely agreed with the criticism and promised to do better.
And then nothing changed."&lt;/p&gt;
&lt;p&gt;Pascal resumed walking.&lt;/p&gt;
&lt;p&gt;"Since our team is not programming anymore, all our skills will vanish in a couple years!
Programming is a craft, if you don't practice it you lose it!
Now the only one doing any programming is someone who never learns anything!"&lt;/p&gt;
&lt;p&gt;Johnson crossed his arms.
Pascal caught his breath.&lt;/p&gt;
&lt;p&gt;"This is a developer that absolutely refuses any and all long-term responsibility and only produces brittle code.
Like a baby, he must be continuously supervised.
It's exhausting!
We loved our work before..."&lt;/p&gt;
&lt;p&gt;Johnson was getting impatient.
Pascal doubled down.&lt;/p&gt;
&lt;p&gt;"What we wanted was to hire an expert coder.
We knew the job market lacks qualified workers.
Instead of doing what we needed to do – hire a team member – we hired a typist.
His work is nonsense and he has to go.
If you say he stays, that will kill motivation for the rest of the team.
And kill their skill, since nobody is practicing their craft.
Meanwhile, the typist is unable to learn anything!"&lt;/p&gt;
&lt;p&gt;Long Johnson seemed to enlarge in his chair.
His head was turning red.&lt;/p&gt;
&lt;p&gt;"Okay, Pascal, listen.
Everything you are saying is very hard to measure.
Only his typing speed is easy to measure."&lt;/p&gt;
&lt;p&gt;"Long, the job is not typing.
The job is to communicate to understand the market, the company, the users, the product; to learn a language, some libraries, how to write good code; then write it, read it, maintain it, document it and then communicate some more.
Typing is not even one percent of the work."&lt;/p&gt;
&lt;p&gt;"I know, Pascal.
What I don't understand is why an expert would forget what they already know."&lt;/p&gt;
&lt;p&gt;"Johnson, I know exactly how to explain this to you.
This is something strange about the profession.
You see, if a lawyer or a doctor has practiced their profession for 40 years, then they are 40 years better than when they started.
But that's not true of developers.
10-year-old technology is obsolete technology.
Nobody cares if you know AngularJS 1 – it was abandoned 10 years ago.
The value of a developer is only in what she's been doing the last 10 years."&lt;/p&gt;
&lt;p&gt;Johnson sighed – Pascal was preaching again.&lt;/p&gt;
&lt;p&gt;"A programmer must be learning new things daily.
Learning is part of the profession.
But here's the thing about learning:
Humans learn by making!
Constructivism.
Jean Piaget.
Reading a book on a technology is not enough to learn it.
One must build with it; only then does one learn.
Without the practice, the theory does not sink in.
This is how this wonderful team, full of experts, will become a bunch of ignorants if they don't keep writing code."&lt;/p&gt;
&lt;p&gt;"Isn't there some other solution to this problem?"&lt;/p&gt;
&lt;p&gt;Pascal laughed. "Yeah, we could practice in our copious free time."&lt;/p&gt;
&lt;p&gt;Johnson shook his head.
"No need for the sarcasm.
You are getting emotional.
This is a serious question.
Can you work in a different way to embrace Hackerman's higher productivity?"&lt;/p&gt;
&lt;p&gt;"Higher?
You mean negative.
I will be the first to quit my job.
I love programming, that is why I am a programmer.
I enjoy the creative activity of writing good code, using skills acquired over decades of study.
Reviewing someone else's bad code is boring and painful.
And it is not programming."&lt;/p&gt;
&lt;p&gt;"So you aren't interested in focusing on high-value alignment tasks and thought stewardship?
Well, so be it.
I find Hackerman productive because he delivered a few demos in no time.
I was very impressed."&lt;/p&gt;
&lt;p&gt;"But making a tiny demo is very different from maintaining a large codebase!
Look, Long!
We were building an awesome team.
The guys were improving and learning together.
But Agapito is harmful to the team – he sets an awful example.
A passive typist who never tries to interact with anyone else.
Can you imagine how limited his world experience must be?
Yet he apparently gets your approval."&lt;/p&gt;
&lt;p&gt;"It's true, and I need to let you know why it is so."&lt;/p&gt;
&lt;p&gt;Pascal was paralyzed to hear that.
He turned his face a little, as if to point his good ear towards Johnson.
Or maybe protect the other ear.&lt;/p&gt;
&lt;p&gt;"Brace yourself, you are not going to like my decision."&lt;/p&gt;
&lt;p&gt;Pascal started biting his tongue.&lt;/p&gt;
&lt;p&gt;"Hackerman's salary is one tenth of any other team member's.
I am telling HR to scout Microsoft Academy. Look for others like him.
I think we can drive the cost of development down by pairing each expert with a good typist – like a co-pilot.
The experts can focus on vision harmonization.
When I present the idea, the slide will be titled 'Post-human efficiency'!"&lt;/p&gt;
&lt;p&gt;Pascal blinked a few times.&lt;/p&gt;
&lt;p&gt;"Long, I just told you one Agapito already tasks the entire team with his mistakes.
And you want to hire more Agapitos?"&lt;/p&gt;
&lt;p&gt;"Yep!"&lt;/p&gt;
&lt;p&gt;"I just explained how and why that ain't gonna work.
Have you forgotten everything you learned in the Agile course?
...And everything I just told you?"&lt;/p&gt;
&lt;p&gt;"No, I haven't.
But even if I understand you partially, you know who doesn't?
Our CEO.
He likes numbers, graphs and objective things.
My strategy takes all of two seconds to explain.
But Agile and your arguments are hard to explain.
When I talk to him, I don't get the feeling I have time or permission to teach him anything."&lt;/p&gt;
&lt;p&gt;"Honestly, Long, that's just dumb.
You are forgetting a manager has a duty to protect his team.
And you know who will suffer the consequences?
The team, the product, the customers, and the company, in that order."&lt;/p&gt;
&lt;p&gt;"Well, such is the world, Pascal."&lt;/p&gt;
&lt;p&gt;Pascal Devoto still searched for words, then suddenly stormed out of the room.
The entire office heard three loud door impacts.
In the corridor he rushed past a Microsoft banner. It said:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Faster. Smarter. Limitless. Let the AI build your future.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;An alliance with Microsoft was announced two weeks later. Stock went up 3%.&lt;/p&gt;</description><category>agile</category><category>computing</category><category>fiction</category><category>literature</category><category>programming</category><category>story</category><guid>https://read.nando.audio/posts/new-employee.html</guid><pubDate>Thu, 29 May 2025 08:00:00 GMT</pubDate></item><item><title>On the use of harmful tools</title><link>https://read.nando.audio/posts/harmful-tools.html</link><dc:creator>Nando Florestan</dc:creator><description>&lt;p&gt;…So you are to manage some software creation. Then you must understand you cannot simply employ the same techniques used to manage other domains. Software creation is strange – many counterintuitive truths about it. You will fail unless you learn about these weird realities.&lt;/p&gt;
&lt;p&gt;This series contains these posts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://read.nando.audio/posts/waterfall.html"&gt;How to hire a development team&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://read.nando.audio/posts/counterintuitive.html"&gt;Counterintuitive facts of software development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://read.nando.audio/posts/no-estimates.html"&gt;No estimates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://read.nando.audio/posts/harmful-tools.html"&gt;On the use of harmful tools&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Summary&lt;/h3&gt;
&lt;p&gt;Big Tech is incentivized to oversell AI’s capabilities.
They're marketing it as "productivity" while gutting skilled labor and consolidating power.
It's a profit-maximizing maneuver masquerading as innovation.&lt;/p&gt;
&lt;p&gt;AI-generated code is not magic.
It's pattern-matching, not reasoning.
It lacks context-awareness, long-term responsibility, and often produces brittle or misleading output.&lt;/p&gt;
&lt;p&gt;Today, Big Tech companies are peddling AI tools before these are ready for prime time.
For now, AIs are hallucination machines that cannot be trusted with making decisions without supervision, yet this is exactly how we are already using them.&lt;/p&gt;
&lt;p&gt;Big Tech makes insanely exaggerated claims, such as a 3x productivity gain just by using an AI tool.
Seduced by these, managers are accepting losses in all the aspects involved in maintaining a codebase, and then hyping their own fictitious feats with AI.&lt;/p&gt;
&lt;p&gt;But real software development is a craft.
It requires learning, culture, understanding, reasoning, practice, intuition, refactoring, communication...
Some of these the AI can do badly; some it cannot do at all. Not yet.&lt;/p&gt;
&lt;p&gt;Businesses try real hard not to see that software development is an art.
If they see it, they pretend they forget it.
However, art has its own requirements, and one forgets these at one's own peril.&lt;/p&gt;
&lt;p&gt;Inserting AI as the code writer yields no real increase in productivity – and worse, it requires fundamental changes in the software development process. I will show that some of these changes are, in fact, impossible for humans, though not all humans can see it.&lt;/p&gt;
&lt;p&gt;The industry is buying the hype way too early.
Developers, managers, even companies are swallowing the narrative before the technology has earned it.&lt;/p&gt;
&lt;p&gt;So my thesis is:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pushing programmers and writers to use smart tools such as AI is harmful and infringes Agile principles.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Though it might seem to be what everyone is doing, it's the opposite of what you should be doing.&lt;/p&gt;
&lt;p&gt;After I wrote this post, I found:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://newsletter.theseriouscto.com/p/ai-coding-assistants"&gt;an independent evaluation with very similar findings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=W4tqbEmplug"&gt;a Simon Sinek interview&lt;/a&gt; in which
he says today we are obsessed with output and losing track of humanity in AI adoption.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;A word about intelligence&lt;/h3&gt;
&lt;p&gt;What is intelligence?&lt;/p&gt;
&lt;p&gt;Intelligence is &lt;strong&gt;establishing true relationships&lt;/strong&gt; between things previously considered separate and unrelated.
Intelligent people show you how things relate between themselves.
A void gets replaced by a model.&lt;/p&gt;
&lt;p&gt;Contemporary normoses are always due to a lack of respect for the necessary relationships between systems.
An obvious example is the lack of relationships between the economy and the environment, even though doing what the environment "demands" of us would be beneficial to all people and all generations.&lt;/p&gt;
&lt;p&gt;Why am I talking about intelligence?
Well, for the following argument, I need an intelligent reader – one that doesn't have difficulty evaluating new or infrequently made relationships.&lt;/p&gt;
&lt;p&gt;I also need a patient reader.
I know this post is too long. But fuck you, reader. Read it in 2 sittings or something.
To establish relationships between things I need the space.&lt;/p&gt;
&lt;h3&gt;The argument&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;If you don't let your students use AI, why do you let your workers use AI?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In education, AI usage is avoided for 2 simmetrical reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Middle school and high school students must not use AI because they must learn to write by practicing writing.&lt;/li&gt;
&lt;li&gt;College-level students must not use AI because the output is not college-level.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The same reasons apply to your employees:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Junior devs are still learning to write software, so they must practice the damn craft of writing damn software – not have someone else do it for them.&lt;/li&gt;
&lt;li&gt;Senior devs write software much better than the AI, so there isn't much gain for them.&lt;ul&gt;
&lt;li&gt;But also, writing software is a craft, exactly like writing prose is a craft.
    A craft must be exercised, or you lose it.
    So a senior dev must continue to write software – or her knowledge, skill and stamina will atrophy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Now in more detail&lt;/h3&gt;
&lt;p&gt;The plagiarism problem always existed, it is not new.
And there was never a different solution.
Plagiarism is not tolerated, ever.&lt;/p&gt;
&lt;p&gt;You know a student must learn to write her own dissertation, because that is an essential life skill.
You forbid AI for the student – when writing her English assignment – so they will actually practice the skill.
If that is the case – why are you doing the exact opposite when it comes to people who work for you?&lt;/p&gt;
&lt;p&gt;Every professional writer in the world tells us writing is a muscle that must be exercised everyday.
They force themselves to practice their craft every morning and they know they get worse when they don't.&lt;/p&gt;
&lt;p&gt;If a high school student must practice her writing, why do you think your worker doesn't need to do the same?&lt;/p&gt;
&lt;p&gt;Am I talking about writers or coders? Yes.&lt;/p&gt;
&lt;p&gt;This applies to the writing of prose and computer programs, both.
There is no difference.
A programmer also knows they are worse after a vacation.
It takes a few days of work to get back to speed.&lt;/p&gt;
&lt;p&gt;Agile is about developing the people more than the process.
Improving the process is worthy; but we understand developing the workers has even more value.&lt;/p&gt;
&lt;p&gt;Agile recognized that building a great team is the single most important thing the business needs to do.
Notice I didn't say hiring a great team, I said building it.&lt;/p&gt;
&lt;p&gt;If you are not making an effort to provide the necessary environment and motivate the team to improve, then your organization is not truly Agile.&lt;/p&gt;
&lt;p&gt;Therefore, using certain tools by default is against Agile, inasmuch as these tools hurt team building.&lt;/p&gt;
&lt;p&gt;Now I will give examples and establish further relations with other matters.&lt;/p&gt;
&lt;h3&gt;Example 1&lt;/h3&gt;
&lt;p&gt;To hire a writer, I want to measure her grammar skills.
So I ask her to correct the grammar in some text I've written.
But she uses AI to do the correction.
Now I cannot evaluate her knowledge, it is mixed with the AI's knowledge.
Here the AI's knowledge is noise, because it is essentially free for me – I don't need to hire the writer to get AI-level results.&lt;/p&gt;
&lt;p&gt;You certainly see the only way to evaluate the writer is to forbid usage of AI.&lt;/p&gt;
&lt;p&gt;But then, after she is hired, why would I push her to use AI, if that means exercising her muscles less, and therefore getting worse? Do I want my worker to atrophy???&lt;/p&gt;
&lt;p&gt;The HR department, as a system, typically complains that the job market lacks qualified workers and develops means to find and hire them.
But after the expert is finally hired, her manager now expects her to be reviewing AI slop, instead of using her expert skills to write?&lt;/p&gt;
&lt;p&gt;Can't anyone see this will result in her losing her expertise over 2 years?
Or is she now supposed to study and practice her craft in her copious free time?&lt;/p&gt;
&lt;p&gt;The artisan exists before the artist.
Without an artisan you don't get an artist.
You can't have a craftsman that doesn't practice her craft.&lt;/p&gt;
&lt;p&gt;The HR department cannot find qualified workers, but hired workers must become progressively less qualified. Wonderful.&lt;/p&gt;
&lt;p&gt;How can companies act in such a schizophrenic way?
Because businesses lack intelligence, which is the ability to establish relationships between systems that appear to be separate.&lt;/p&gt;
&lt;h3&gt;Planning the obsolescence of writing itself&lt;/h3&gt;
&lt;p&gt;But even worse, businesses have been firing writers, since they figure writing is now a job for an AI.
Can they really not see the ways in which AI slop lacks creativity and personality?
Can they not feel the sterile sameness in everything the AI writes?&lt;/p&gt;
&lt;p&gt;But it's even worse: Nadella is peddling a product that liberates illiterate executives from the task of reading.
The AI does all the reading for him, and "summarizes".
This person believes in building a world in which I carefully write an email and he doesn't even read it!&lt;/p&gt;
&lt;p&gt;What a dystopic world, in which human communication will be mediated not just by distance and screens, but also by a summarizing idiot who misunderstands every other sentence!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Nadella peddling AI usage for managers" src="https://read.nando.audio/images/2025-nadella-ai.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Nadella might discover he is a replicant himself...&lt;/p&gt;
&lt;p&gt;And you thought &lt;em&gt;I&lt;/em&gt; was extreme when I wrote "fuck you, reader", didn't you?
Well, what about Nadella's "fuck all writers"?&lt;/p&gt;
&lt;p&gt;"Never read anything if you value your time!" –
That's his advice, and if you follow it, you are one fucked up reader!&lt;/p&gt;
&lt;p&gt;If we remember that, in the Gold Rush, the ones who got really rich were those selling tools, Nadella is doing right by his company.
But he is also doing wrong by humanity.
That's the threat of a new normose, which as we saw before, is lack of intelligence.&lt;/p&gt;
&lt;h3&gt;This is not prejudice&lt;/h3&gt;
&lt;p&gt;I have no prejudice or hate against the tools themselves.
For instance, look at a sane example:&lt;/p&gt;
&lt;p&gt;Even after the computer finally beat man at chess, man continued to play chess.
Man did not stop memorizing hundreds of openings, did not stop practicing the endgame, and did not stop playing chess, since it is a wonderful sport for the mind.&lt;/p&gt;
&lt;p&gt;The computer changed the game forever, yes.
Man now tries to learn from the computer, too.
But giving up the skill and letting the computer have the chess game for itself, that's what we are incapable of doing.
In fact, chess is now more popular than ever.&lt;/p&gt;
&lt;p&gt;It's not about winning, anyway.
It's about the Olympic spirit.&lt;/p&gt;
&lt;p&gt;Get better than you are now – for you are a man.&lt;/p&gt;
&lt;p&gt;AI currently sucks hard at creative endeavors.
It is okay at reformulating existing language, improving the vocabulary used, and maintaining coherence (as long is it understands the content).
But it's awful at creating literature, stories, jokes, poetry, music, art etc.
But suppose AI does become good – would man give up the arts?&lt;/p&gt;
&lt;p&gt;Of course not.
Not in a million years.&lt;/p&gt;
&lt;p&gt;Be a man. Get awesome.&lt;/p&gt;
&lt;h3&gt;Example 2 (mild)&lt;/h3&gt;
&lt;p&gt;Woody Zuill tells a story.
A couple programmers on the team were delivering code in which the architecture left something to be desired.
Instead of having the code corrected, he tolerated it while giving the team ample time and incentive to study these matters.
In just a couple of weeks, the devs had acquired the skills and were themselves correcting those mistakes.
No feelings were hurt, the team was enthusiastic (due to learning), and Man did what (s)he is supposed to do: learn and improve.&lt;/p&gt;
&lt;p&gt;Zuill temporarily sacrificed product quality in order to develop a happier and more capable team.
That was the wise choice.
Is this what most IT companies are currently doing???&lt;/p&gt;
&lt;p&gt;Or are they saying you shall be happy vibe-coding?
Are you going to be happier in your relationship to a human team, or by becoming a cyborg?&lt;/p&gt;
&lt;h3&gt;Example 3 (the kicker)&lt;/h3&gt;
&lt;p&gt;I will leave you with &lt;a href="https://youtu.be/nY6RExFP0G0?si=Dttbl7PX9AoHW37E&amp;amp;t=819"&gt;this example by Dave Farley&lt;/a&gt;, which I invite you to watch in his own words.
But I will paraphrase his tale here if you prefer to read:&lt;/p&gt;
&lt;p&gt;Dave gets hired a second time by the same company to &lt;em&gt;rescue&lt;/em&gt; a problematic software project.
Dave realizes a certain dev doesn't know how to code – the guy even avoids &lt;em&gt;for&lt;/em&gt; loops in Java because he doesn't know how &lt;em&gt;for&lt;/em&gt; loops work.
The dev is an impostor.
Dave tells the company, this guy shouldn't be working here, he is not good enough.
The company answers, what do you mean, his code review skills are legendary in the company.
In the end, it is discovered that the guy simply used an IBM tool for code reviews, and understood none of it.&lt;/p&gt;
&lt;p&gt;Now imagine how much financial loss that employee was responsible for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;His own salary for years.&lt;/li&gt;
&lt;li&gt;The damage he caused to the codebase every day, putting the project at risk.&lt;/li&gt;
&lt;li&gt;The rates of the experts eventually hired to rescue the project.&lt;/li&gt;
&lt;li&gt;The administrative decision making, required to hire the experts.&lt;/li&gt;
&lt;li&gt;The license paid to IBM for a tool that is actually harmful to the team.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(The last bullet is mine, not Dave's.)&lt;/p&gt;
&lt;h3&gt;Exercise for the reader&lt;/h3&gt;
&lt;p&gt;Obviously, constantly using AI can be even more harmful than the code review tool; but I want you to think about something else:&lt;/p&gt;
&lt;p&gt;From the story above, what can you conclude about the practice of code reviews?
If a complete amateur can hold a job by using a tool to do code reviews, doesn't that say something about code review as a practice?&lt;/p&gt;
&lt;p&gt;Why don't you think about it first?
Next I'll tell you what I think.&lt;/p&gt;
&lt;h3&gt;The hysteria about AI&lt;/h3&gt;
&lt;p&gt;The most current and modern tremendous mistake being committed in the IT industry is, of course, the premature acceptance of code written by AI, disregarding every aspect of it just because it gets done fast.&lt;/p&gt;
&lt;p&gt;The AI companies affirm the AI is equivalent to a junior developer; the managers have no experience of the actual work of producing software, so they believe that hype and stop hiring juniors.&lt;/p&gt;
&lt;p&gt;Then juniors do not, over time, learn and become seniors and soon the industry will be devoid of qualified workers.&lt;/p&gt;
&lt;p&gt;AI cannot yet replace humans because its experience of the world is too limited.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It cannot be aware of the whole project in one prompt/interaction.&lt;/li&gt;
&lt;li&gt;It cannot compile the code it writes.&lt;/li&gt;
&lt;li&gt;It cannot execute the automated tests.&lt;/li&gt;
&lt;li&gt;It cannot ask for clarifications.&lt;/li&gt;
&lt;li&gt;It cannot ask for the opinions of team members.&lt;/li&gt;
&lt;li&gt;It has no concept of the history of the project.&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So it's easy to see that comparing a simple tool to a human is nonsensical.
Saying an AI is equivalent to a junior dev is to see the junior dev only within the task of writing some code, as if that could be done without all these other tasks.&lt;/p&gt;
&lt;p&gt;The truth is, code written by AI is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;as mediocre as the code it was trained on,&lt;/li&gt;
&lt;li&gt;full of hallucinations,&lt;/li&gt;
&lt;li&gt;not yet compiled, not yet tested, not discussed, not aligned with overarching goals of the project,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;...and by the time the developer takes care of everything that is missing, which is boring work, any productivity gains have been inverted.&lt;/p&gt;
&lt;p&gt;Further, it has recently been discovered that &lt;a href="https://www.youtube.com/watch?v=ai77Pa79_TY"&gt;using AI for coding has become insecure, due to a new kind of attack called slopsquatting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nevertheless, in &lt;a href="https://www.youtube.com/watch?v=BnVY1NDn4Mg"&gt;this video&lt;/a&gt;, Theo realizes that code written by Artificial Intelligence is a reality in companies and that we need to adapt our workflow.
Then he makes the most obvious mistake:
He thinks we need to improve our ability to review code.&lt;/p&gt;
&lt;p&gt;I like Theo's videos because his takes are always mistaken and short-sighted.
For instance, his irrational hatred of Flutter, which is a lovely piece of technology.
When I agree with Theo on something, I know I need to think more!&lt;/p&gt;
&lt;h3&gt;Code review is a scam&lt;/h3&gt;
&lt;p&gt;Another effect of AI is that a programmer is no longer a programmer.
She is just a code reviewer now. The AI codes, the dev reviews.&lt;/p&gt;
&lt;p&gt;As a developer, I am now supposed to be slowly reviewing code quickly written by a moron (the AI) –, which is a job I hate.&lt;/p&gt;
&lt;p&gt;I became a developer because I love programming.
They are taking away the creative activity I love – writing good code, using skills acquired over decades – and telling me to do something boring instead: fix bad code, all the time.&lt;/p&gt;
&lt;p&gt;Further, there is no way to teach a person to be a code reviewer.
That's impossible.
You can only learn to program, and then, after you program well, you can review code, badly.&lt;/p&gt;
&lt;p&gt;One learns to program by programming, not by reviewing code.
The practice of programming is indispensable.
One cannot truly understand, for instance, object-oriented programming simply by reading a book.
The practice of it is what finally teaches you.&lt;/p&gt;
&lt;p&gt;The same applies to libraries, not just programming languages.
You start a code review and you see the AI wrote this:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;caprese&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You have never seen this &lt;em&gt;caprese&lt;/em&gt; library before.
(Assume the library is legitimate; I am not talking about the security problem mentioned above.)
What do you do now? You know the AI hallucinates.
Do you blindly trust its usage of the library?
Or do you start reading the documentation of the library?&lt;/p&gt;
&lt;p&gt;Remember, management told you to work faster by using AI.
How much time should you now spend validating the AI's hallucinations about this &lt;em&gt;caprese&lt;/em&gt; library?&lt;/p&gt;
&lt;p&gt;Are you so inexperienced in codebase maintenance that you allow any unknown library to enter your dependencies – much less a library suggested without any consideration of the rest of your codebase?&lt;/p&gt;
&lt;p&gt;Beyond security problems, have you never had a library become unmaintained and start generating thousands of warnings after you upgrade the version of your programming language?&lt;/p&gt;
&lt;p&gt;You are an expert; how on Earth did the powers that be conclude you would work faster by reviewing the thoughts of an idiot?
Do they not know that software development is an immensely complex craft?
Is it not insulting to you that they see you as a monkey typing words on a keyboard?&lt;/p&gt;
&lt;p&gt;And how are you going to learn to properly use the library if you are not even programming anymore???
You think reading documentation makes up for it???
Have you never heard of &lt;a href="https://en.wikipedia.org/wiki/Constructivism_(philosophy_of_education)"&gt;Constructivism&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;The philosopher Ludwig Wittgenstein affirmed that &lt;em&gt;man can only truly understand that which he creates&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The idea that human programmers could ever become just code reviewers is the single most absurd thing I have ever heard in this industry.&lt;/p&gt;
&lt;p&gt;But it's even worse than that. Code review itself is a mistaken practice.&lt;/p&gt;
&lt;p&gt;I realize that reviewing code is impossible.
This is because writing code is a creative activity that begins with the programmer concentrating on all the information necessary to write the code, including how the thing works right now and how the thing should work tomorrow.&lt;/p&gt;
&lt;p&gt;Whereas reviewing code doesn't start from the same point.
It starts with the subject reading new code, at which point several assumptions happen.&lt;/p&gt;
&lt;p&gt;The user story, the objectives, the necessary information that drove the writing.
Do you think the code reviewer can be as aware of these things as the code writer was?&lt;/p&gt;
&lt;p&gt;And there was a process.
Maybe the code was written, then rewritten.
But the reviewer is absolutely unaware of the evolution of ideas in the mind of the writer.&lt;/p&gt;
&lt;p&gt;In practice, the code reviewer's preoccupations are different from the code writer's, and that creates problems.&lt;/p&gt;
&lt;p&gt;As a simple matter of human perception, conscience after creation is much deeper than conscience after revision.&lt;/p&gt;
&lt;p&gt;In a code review one probably should question everything, but that is impossible to do.
In reality, only a handful of things can be questioned in a code review – and then we are tired.&lt;/p&gt;
&lt;p&gt;This is why, in years and years of experience, code reviews have never been able to catch enough bugs.
It is absolutely necessary to test all the written code.
And before testing, you need to understand the impact of the change so you know which screens and which use cases need to be tested.
And if you don't test, there will certainly be problems despite the greatest possible skill in reviewing the code.&lt;/p&gt;
&lt;h3&gt;…just like UML was a scam&lt;/h3&gt;
&lt;p&gt;There are similar mistakes that have been made in the history of programming – for example, a focus on UML.
For a long time, there was a class of programmers who did not use a code editor, they used Word or software to make diagrams.
They were what we called &lt;em&gt;office programmers&lt;/em&gt;.
Gradually, the focus on diagrams was abandoned, because a programmer, in order to think correctly, needs to be in front of her editor, not in front of tools that only express abstractions and do not compile.&lt;/p&gt;
&lt;p&gt;They say "paper accepts anything". That's the problem with diagrams. Also the problem with code reviews.&lt;/p&gt;
&lt;p&gt;A code review does not occur in a text editor, it occurs in a code commenting interface.
Just as UML could be divorced from reality, a code reviewer also has trouble seeing reality for what it is, and may make suggestions that either aren't practical or do not aim at the objective of the current user story, because a reviewer is not so conscious of either, compared to a creator.&lt;/p&gt;
&lt;h3&gt;The alternative to code reviews&lt;/h3&gt;
&lt;p&gt;(Pair programming is the right answer.)&lt;/p&gt;
&lt;p&gt;At the moment of a code review, I don't anymore do a code review.
I become co-creator instead of reviewer.
I do code changes, and then I ask the original developer to look at my changes.
This is the only way to ensure the code review doesn't descend into nonsense.&lt;/p&gt;
&lt;p&gt;I open my editor and I rename the variables that are poorly named.
I add the &lt;em&gt;else&lt;/em&gt; clause that is missing after the &lt;em&gt;if&lt;/em&gt; clause.
With each improvement I make to the code, it becomes possible for me to see other problems.&lt;/p&gt;
&lt;p&gt;If I didn't solve the issues I already saw, I wouldn't be able to see further.
I don't know why this is so, but this is how my conscience behaves.
I have to open the tomb first, then I can see the spider webs.
I have to clear the webs, then I can see the dust.
I have to clear the dust, then I can see the hieroglyphs.&lt;/p&gt;
&lt;p&gt;A man walks into a doctor’s office, frantic.
"Doctor, you’ve got to help me!
I think I’m going blind – I can’t see a thing out of my left eye!"&lt;/p&gt;
&lt;p&gt;The doctor looks at him carefully and says,
"Well, that’s serious. But I also notice your right leg is missing – what happened?"&lt;/p&gt;
&lt;p&gt;The man waves it off,
"Forget the leg! That’s old news!"&lt;/p&gt;
&lt;p&gt;This is why code reviews fail: people are unable to agree on what to focus on.
Cognitive overload and tunnel vision are common realities.&lt;/p&gt;
&lt;p&gt;When I review code and ask for certain changes, the programmer often misses my point and creates a third strange version.
Showing a better result (and letting them compare) is more effective than meta-talking about an idea that for the present is only in my head.&lt;/p&gt;
&lt;p&gt;So code review is not possible as code review, it is only possible as code maintenance done in an editor.&lt;/p&gt;
&lt;p&gt;Pair programming, or mob programming, is the right idea.
Code reviews are too late, too tiresome, too costly and too ineffective.&lt;/p&gt;
&lt;h3&gt;AI does not edit&lt;/h3&gt;
&lt;p&gt;But it's even worse than that.&lt;/p&gt;
&lt;p&gt;AI is a machine that creates legacy code.
The challenge with legacy code is understanding its intention, which has been lost because the people are no longer there.
If only the original developer were around, you could ask her what led to certain decisions.
The reasons for the code to be this way.&lt;/p&gt;
&lt;p&gt;But in this case, the intention – if it ever existed – is impossible to determine, because the AI does not have a personality; it has different beliefs, priorities and knowledge each time you run a prompt through it.
The output can be markedly different even if the prompt is always the same.&lt;/p&gt;
&lt;p&gt;AI is unable to edit code – it can only rewrite code.
This leads to a huge patch each time.
Instead of a laser focus on the detail that needs changing, you get a completely new program!
How on Earth can you manage that?&lt;/p&gt;
&lt;p&gt;This is such a messy way to work and understand code that any productivity gains – &lt;a href="https://www.youtube.com/watch?v=fJGNqnq-aCA"&gt;which are all lies, by the way&lt;/a&gt; – would be reversed by the time the bugs hit production.&lt;/p&gt;
&lt;p&gt;The mess created by using AI – a mess that affects the diffs in the git repository, the ability to reason about the code, the expertise of the worker herself, and the fun of working, is so grave that no ability to type code faster can compensate.&lt;/p&gt;
&lt;h3&gt;Managers never explain the reason&lt;/h3&gt;
&lt;p&gt;I believe most of what I am saying is obvious to any developer, but humans are terrified of going against the mob.
In this case, AI hype and greedy managers have already created a mob.&lt;/p&gt;
&lt;p&gt;Let us read an example &lt;a href="https://www.youtube.com/watch?v=Tm8RG1leX8c"&gt;told in a YouTube comment on 2025-05-28&lt;/a&gt;.
This person is a video editor in a large company:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(...) Everytime I or anyone makes suggestions on shooting photos or video with real environments we’re asked to “think how we can incorporate Ai into it” or even just skipping hiring models and actors to use Ai instead.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Where I work, the executives, directors and managers don’t want to listen to creative professionals or employees with the skill set. Speaking up just puts a target on your back. During my end of year review, the only thing they told me to work on was to “embrace Ai more”. The CEO even had to write a company wide email about how “our industry is moving towards Ai and we need to follow”. Funnily enough, had he just made Ai write that email, it wouldn’t have sounded so cold and depressing.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;But notice how managers are always prescriptive, they never explain anything.
The pressure of using AI now... is postulated, not proven.
There is never any justification given for the new directive, much less one that would survive some scrutiny.&lt;/p&gt;
&lt;p&gt;The real message is, AI is faster and cheaper, therefore it shall be used, even at the expense of everything else:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The sanity of the team&lt;/li&gt;
&lt;li&gt;The jobs of the team&lt;/li&gt;
&lt;li&gt;The sanity of the process&lt;/li&gt;
&lt;li&gt;The knowledge, expertise, and wisdom acquired over decades&lt;/li&gt;
&lt;li&gt;The quality of the product&lt;/li&gt;
&lt;li&gt;Customer satisfaction&lt;/li&gt;
&lt;li&gt;Everyone's humanity&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;...and the only thing that remains possible is for managers to pat themselves in the back, self-congratulating for gains that are, in fact, false.
Such managers should embrace AI by stepping down.
Even an AI would do a better job.&lt;/p&gt;
&lt;p&gt;However, in the end, the proof shall be in the pudding.
Companies that "embrace AI" in a stupid way will certainly suffer.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;A programmer must program as a writer must write as a pianist must play.
Smart tools can hinder the exercise and development of one's craft.&lt;/p&gt;
&lt;p&gt;AI spoils man's memory, thought and self-improvement.
It can type lines faster, but in a manner that is not manageable, and people are going to suffer and die for this reason.&lt;/p&gt;
&lt;p&gt;Companies must realize the importance of motivating people to develop their craft and become their best selves.
Companies that push a tool that will hinder the development of the team certainly are not Agile.&lt;/p&gt;
&lt;p&gt;Architecture before coding was divorced from reality.
&lt;a href="https://read.nando.audio/posts/no-estimates.html"&gt;Estimates in software were divorced from reality.&lt;/a&gt;
&lt;a href="https://read.nando.audio/posts/waterfall.html"&gt;Waterfall&lt;/a&gt; was divorced from reality.
The solution to these three was never to learn to do them better; we tried that and it failed.
The solution was to stop doing them.&lt;/p&gt;
&lt;p&gt;Code review is like that, it is the great mistake of this generation.
We will spend 25 years trying to review code, striving to do it better.
Finally we will realize what Wittgenstein and Constructivism already knew:
Building it yourself is an essential step to understanding it.
Humans cannot review code well, they can only write and maintain code well.&lt;/p&gt;
&lt;p&gt;You can do pair programming with a human, but not with an AI.
If you can only review the AI's code, then that's not a realistic option, since code reviews are insufficient.&lt;/p&gt;
&lt;p&gt;AI cannot yet replace humans because its experience of the world is too limited.
But by abusing our interim hyped AI, we are having it replace quality, accountability, and the soul of engineering.&lt;/p&gt;
&lt;p&gt;Ultimately, we are talking about Robert C. Martin's maxim: "The only way to go fast is to go well".
The problem is not new.
Software developers, as professionals, have the duty to say "no" to every ignorant management measure that hurts development while trying to make it faster.
It is a disgrace that so many professionals swallow it.&lt;/p&gt;</description><category>agile</category><category>computing</category><category>programming</category><guid>https://read.nando.audio/posts/harmful-tools.html</guid><pubDate>Sat, 26 Apr 2025 12:00:00 GMT</pubDate></item><item><title>No estimates!</title><link>https://read.nando.audio/posts/no-estimates.html</link><dc:creator>Nando Florestan</dc:creator><description>&lt;p&gt;…So you are to manage some software creation. Then you must understand you cannot simply employ the same techniques used to manage other domains. Software creation is strange – many counterintuitive truths about it. You will fail unless you learn about these weird realities.&lt;/p&gt;
&lt;p&gt;This series contains these posts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://read.nando.audio/posts/waterfall.html"&gt;How to hire a development team&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://read.nando.audio/posts/counterintuitive.html"&gt;Counterintuitive facts of software development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://read.nando.audio/posts/no-estimates.html"&gt;No estimates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://read.nando.audio/posts/harmful-tools.html"&gt;On the use of harmful tools&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Estimation is impossible&lt;/h3&gt;
&lt;p&gt;From other fields came the notion that deadlines can be set.
But one of the most striking bizarre facts about software creation is this:&lt;/p&gt;
&lt;p&gt;It is impossible to anticipate when the thing will be done with any reasonable amount of certainty.&lt;/p&gt;
&lt;p&gt;This was gradually discovered during the history of software development.
It is impossible to estimate development effort, because in programming, difficulty is accidental, it is not predictable.
One does not know what the trouble is going to be.&lt;/p&gt;
&lt;p&gt;If you cook pierogi once, you have some idea of how long it will take you next time.
But new software is like writing a new book or researching new tech.
Treating it like pierogi is so wrong, it is offensive.
Only in very few cases is software so repetitive, and in those cases, it is not very valuable.
Valuable software does something new enough that you can't estimate it.&lt;/p&gt;
&lt;p&gt;In such cases, I don't know how long it's going to take, because I haven't written it yet.&lt;/p&gt;
&lt;h3&gt;History&lt;/h3&gt;
&lt;p&gt;Since the 70s, devs marveled at how much their estimates were off.
So they concluded: "we should improve our estimation skills.
Learn to estimate better through deeper thinking".
Research on this was done in the 80s, and they came up with better techniques.
Then they saw the results were equally off.
It wasn't until the turn of the century that a few enlightened minds decided estimation was a waste of time.
The result of the estimation was garbage, so they wouldn't do it anymore.
They wouldn't lie to management.&lt;/p&gt;
&lt;p&gt;This idea only began to spread about 10 years ago.
That's &lt;strong&gt;the #NoEstimates movement&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Rubbish&lt;/h3&gt;
&lt;p&gt;The last time I estimated a story with Raphael, we spent 3 hours and came to the same conclusion, so we felt good about it, although we were extremely tired.
But then a better alternative came up and plans changed, so the 6 man-hours were thrown away.
The estimate would need to be redone, and in all that time, nothing useful was being done for the user/client.&lt;/p&gt;
&lt;p&gt;The 6 man-hours were pure waste: doing the estimation hurt the speed of the team.
The estimation was probably incorrect even if we felt good about it, and even if it weren't so, it had no value once we had a better idea and changed our plans.
If you want your team to be fast in delivering working software, requiring estimates is a great way to ensure they will be slow.&lt;/p&gt;
&lt;p&gt;So, you see, in software, estimation doesn't work, its output is garbage and management decisions, business decisions, must not be based on such poor quality information.&lt;/p&gt;
&lt;p&gt;Developers always knew estimates are rubbish, but managers always insisted they need it.
Managers won, but nothing could be done about the fact that, in software, estimates are garbage.&lt;/p&gt;
&lt;h3&gt;Software creation is an interaction&lt;/h3&gt;
&lt;p&gt;When we estimate, we sort of write the software in our heads.
We start scribbling that, to finish this feature, we need to write these new database tables, this database migration, these business rules, these API methods, use this or that library, add this and that to the GUI etc.&lt;/p&gt;
&lt;p&gt;But that's not how it actually works.
When we sit down to do the actual work, we are faced with the entire iceberg, not just the tip we could see.&lt;/p&gt;
&lt;p&gt;Initial estimates often assume a "greenfield" scenario, but in reality, we must integrate with legacy parts of the system, poorly documented code, or unexpected architectural bottlenecks.&lt;/p&gt;
&lt;p&gt;We make bets.
After some software is written, we start to realize whether our bets were off.
Only through building can we understand the true problem and discover better solutions.
We are now interacting with all sorts of unanticipated forces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Requirements were vague, evolving, or misunderstood.&lt;/li&gt;
&lt;li&gt;Real needs become clearer only as the product takes shape.&lt;/li&gt;
&lt;li&gt;Underdeveloped designs.&lt;/li&gt;
&lt;li&gt;Edge cases, usability concerns, or integration issues emerge.&lt;/li&gt;
&lt;li&gt;Unforeseen technical debt.&lt;/li&gt;
&lt;li&gt;Models may be different than how we remembered them.&lt;/li&gt;
&lt;li&gt;Libraries are at least partially unknown.&lt;/li&gt;
&lt;li&gt;The compiler.&lt;/li&gt;
&lt;li&gt;Versions.&lt;/li&gt;
&lt;li&gt;Discovery of steps we didn't anticipate we'd have to do.&lt;/li&gt;
&lt;li&gt;A developer doesn't just develop. She gets sick, she must go into meetings, she needs to pause to fix a bug, she needs to do some planning, she needs to answer e-mails and someone else's questions, she needs to research something before the next sprint... None of this gets factored into an estimate.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short, writing actual software is a struggle against realities that were completely unknown at the time of estimation. &lt;/p&gt;
&lt;p&gt;Implementation is discovery, not execution. This is why Agile emphasizes iterative progress, continuous feedback, and adapting to change.&lt;/p&gt;
&lt;h3&gt;Managers do not understand the word "estimate"&lt;/h3&gt;
&lt;p&gt;When you use estimates, you set yourself up for this eternally repeating conversation:&lt;/p&gt;
&lt;p&gt;"The feature is not ready??? You said it would only take a week."&lt;/p&gt;
&lt;p&gt;"That's not what I said. I gave you an ESTIMATE."&lt;/p&gt;
&lt;p&gt;"That's bullshit!!!" &lt;/p&gt;
&lt;p&gt;"You got that right!!!"&lt;/p&gt;
&lt;p&gt;"How can I meet my goals like this???"&lt;/p&gt;
&lt;p&gt;"What do I know about YOUR job??? My plate is already full of this letter soup!"&lt;/p&gt;
&lt;h3&gt;What to do&lt;/h3&gt;
&lt;p&gt;Developers give estimates just so managers will stop pestering them and go away.
That is an irresponsible thing to do.
The only responsible thing is to deny estimation.&lt;/p&gt;
&lt;p&gt;However, businessmen still need information to be able to make business decisions.
There's an event later this year, that is an important business opportunity, and we need to be able to predict what can be ready by then.&lt;/p&gt;
&lt;p&gt;That is why people have been studying how to make management decisions in the absence of estimates.
Based on other criteria.&lt;/p&gt;
&lt;h3&gt;Not convinced?&lt;/h3&gt;
&lt;p&gt;I do not expect you are convinced.
I was only convinced after weeks of consideration.
But &lt;a href="https://www.youtube.com/watch?v=QVBlnCTu9Ms"&gt;this 37-minute presentation by Allen Holub&lt;/a&gt; is what finally convinced me.&lt;/p&gt;
&lt;p&gt;After 15 minutes, he starts to show how to manage a software project in the absence of estimates, including how to count stories to make graphs and calculate timetables.
After 31 minutes he recommends Story Mapping to organize the backlog and prioritize features for the next release.&lt;/p&gt;
&lt;p&gt;Other notable authors about NoEstimates are Woody Zuill and Vasco Duarte.&lt;/p&gt;</description><category>agile</category><category>computing</category><category>programming</category><guid>https://read.nando.audio/posts/no-estimates.html</guid><pubDate>Fri, 25 Apr 2025 12:00:00 GMT</pubDate></item><item><title>Counterintuitive facts of software development</title><link>https://read.nando.audio/posts/counterintuitive.html</link><dc:creator>Nando Florestan</dc:creator><description>&lt;p&gt;…So you are to manage some software creation. Then you must understand you cannot simply employ the same techniques used to manage other domains. Software creation is strange – many counterintuitive truths about it. You will fail unless you learn about these weird realities.&lt;/p&gt;
&lt;p&gt;This series contains these posts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://read.nando.audio/posts/waterfall.html"&gt;How to hire a development team&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://read.nando.audio/posts/counterintuitive.html"&gt;Counterintuitive facts of software development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://read.nando.audio/posts/no-estimates.html"&gt;No estimates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://read.nando.audio/posts/harmful-tools.html"&gt;On the use of harmful tools&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;The book&lt;/h3&gt;
&lt;p&gt;One of the most interesting and lasting books about software development was written in 1975.
That's &lt;a href="https://en.wikipedia.org/wiki/The_Mythical_Man-Month"&gt;"The Mythical Man-Month"&lt;/a&gt;
by Fred Brooks.&lt;/p&gt;
&lt;h3&gt;On Waterfall&lt;/h3&gt;
&lt;p&gt;I will base this post on famous quotes by him, mainly from that book. Always in italics:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"The Waterfall Model is wrong and harmful; we must outgrow it."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Yep, that's what you learned in the first post in this series.
Brooks already knew it.&lt;/p&gt;
&lt;h3&gt;Brooks' Law&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;"Adding manpower to a late software project makes it later."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The above sentence is known as Brooks' Law.
It's probably the most famous quote from his book.
It sums up one of the most interesting and counterintuitive things about software.&lt;/p&gt;
&lt;p&gt;Suppose you are managing a team and the project is late.
To fix the situation, you hire one or two more people.
You do this because more people will certainly get more work done.&lt;/p&gt;
&lt;p&gt;One month later, maybe two months later even, not only the situation hasn't improved, it's gotten even worse.
You wonder why.&lt;/p&gt;
&lt;h3&gt;First reason for Brooks' Law&lt;/h3&gt;
&lt;p&gt;The most important reason is that communication overhead increases when someone enters the team.
All sorts of information must be asked by the newcomers and answered by old team members:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;about the domain (e.g. accounting in an accounting system)&lt;/li&gt;
&lt;li&gt;about how things work in the system&lt;/li&gt;
&lt;li&gt;about why things have to be this way&lt;/li&gt;
&lt;li&gt;about why the team works a certain way&lt;/li&gt;
&lt;li&gt;about difficulties using the tools&lt;/li&gt;
&lt;li&gt;about the correctness of one's own work&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The communication need is so intense that weeks can pass before a new team member becomes properly productive, and while providing explanations, the experienced team members also have their productivity impacted.&lt;/p&gt;
&lt;p&gt;You want to know how to make this even worse?
Try to preserve the experienced team members from communication up to a degree, or even entirely.
Now the newcomers have no clue what they are doing and have no way to learn valuable things that were already in the culture of the company.
This is because a great amount of knowledge in the team is tacit, not explicit.
Only communication makes it explicit.&lt;/p&gt;
&lt;p&gt;And that is no way to treat a new team member, of course.
It conveys that experienced team members are too busy or too valuable to teach anything to the noobs.
This leads to conflicts and hurt feelings and hurts team formation.&lt;/p&gt;
&lt;p&gt;There is no way to avoid the need for communication, because, in a way, software development is knowledge production.
Every new person increases the communication overhead dramatically, leading to miscommunication, coordination delays, and diminishing returns.&lt;/p&gt;
&lt;p&gt;As a rule of thumb, the larger the development team, the more time needs to be spent in communication, even after everyone is onboard and productive. As Brooks says:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"The number of communication paths increases with the square of the number of people involved."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is a good argument to keep software teams small.
And this is why in Agile no team is larger than 12.&lt;/p&gt;
&lt;h3&gt;Second reason for Brooks' Law&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;"Nine pregnant women cannot produce a baby in one month."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is one of the funniest. Brooks explains:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"When a task cannot be partitioned because of sequential constraints, the application of more effort has no effect on the schedule. The bearing of a child takes nine months, no matter how many women are assigned."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is about activities and decisions that depend on the completion of others.
A manager needs to understand how such dependencies happen in software development.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"Men and months are interchangeable commodities only when a task can be partitioned among many workers with no communication among them."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This means, only when bits of work do not depend on each other, can they be done at the same time.&lt;/p&gt;
&lt;h3&gt;On business analysis&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;"The hardest single part of building a software system is deciding precisely what to build. The most important function that software builders do for their clients is the iterative extraction and refinement of the product requirements. For the truth is, the clients do not know what they want. They usually do not know what questions must be answered, and they have almost never thought of the problem in the detail that must be specified."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The entire development team does business analysis: they try to understand the steps through which work needs to be done.
That quote is amazing near the end.
It is often said that clients only know what they want after they see what they don't want.
Meaning the team presents a design first, and then the client can see flaws in the design and correct it.
But the client is unable to describe what is desired before they see the design.&lt;/p&gt;
&lt;p&gt;The last sentence... "in the detail that must be specified"... is explained in another terrific quote:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"Design work doesn't just satisfy requirements, it elicits them."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Meaning, the requirements exist, but are not known by anyone, until a design suddenly makes them obvious.&lt;/p&gt;
&lt;p&gt;Also, the design must go through iterations. Each iteration allows the team and the client to discover new weaknesses and needs:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"Even the best planning is not so omniscient as to get it right the first time."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Every now and then, no argument will convince an egoic client with enough bad taste:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"Einstein repeatedly argued that there must be simplified explanations of nature, because God is not capricious or arbitrary. No such faith comforts the software engineer."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Software designers are strong in a certain kind of abstract thought, which allows them to see shapes of solutions that apply to many different problems.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"I am more convinced than ever. Conceptual integrity is central to product quality."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I found the same thought expressed in another quote:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"Conceptual integrity is the most important consideration in system design."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Software follows and materializes rules.
You cannot establish rules unless you are thinking very clearly.
In software as in law, good rules are based on sane concepts; bad rules use bad criteria.
Confused concepts will always hurt decisions made by or with the software.&lt;/p&gt;
&lt;h3&gt;It's not requirements&lt;/h3&gt;
&lt;p&gt;The word "requirements" is still used, but now it's wrong.
None of those are required.
They are just ideas, and their priority is always shifting as the business learns about the market, about itself, about current needs etc.
Many of those ideas necessarily will be discarded, which wouldn't happen if they were requirements.&lt;/p&gt;
&lt;p&gt;An Agile team treats potential features as ideas, not requirements.
This clarification is repeatedly made by Jeff Patton, inventor of the Agile technique of Story Mapping.&lt;/p&gt;
&lt;h3&gt;Bugs are priority zero&lt;/h3&gt;
&lt;p&gt;Some people have a notion that they are going to manage bugs.
They think they can list the known bugs and decide which ones to fix.
They want to save developer time spent on bugs!!!
That's outlandish.&lt;/p&gt;
&lt;p&gt;A bug usually is bad behavior whose origin is unknown.
If you are seeing 2 buggy behaviors, they might have the same origin in the code (in other words, they might be the same bug).&lt;/p&gt;
&lt;p&gt;If you let bugs live, they can get compounded.
A bug interacts with another bug, creating a third bug.
At this point, no sane person can understand what is going on with the system.&lt;/p&gt;
&lt;p&gt;If you try to manage bugs, basically you don't understand what the hell is going on anymore. It is hard enough to reason about working software; who can reason about bugs?&lt;/p&gt;
&lt;p&gt;The notion of managing bugs is as absurd as the idea of managing mysteries.&lt;/p&gt;
&lt;p&gt;The only sane thing to do about bugs is to squash them as soon as they are seen.
Now maybe you can reason about your system.&lt;/p&gt;
&lt;p&gt;If I wished to reason about insanity, I would have studied Psychology, not Computer Science.&lt;/p&gt;
&lt;h3&gt;More than 40 hours a week hurts the project&lt;/h3&gt;
&lt;p&gt;Programming is an activity that requires a very high level of concentration.
The brain works very hard and gets tired.&lt;/p&gt;
&lt;p&gt;When a programmer is overworked, his productivity goes down, he feels tired, his concentration is feeble and his decisions are worse.
The quality of the software goes down and sometimes the programmer can produce more bugs than features, effectively hurting the project.&lt;/p&gt;
&lt;p&gt;A developer must work 40 hours per week, tops. No more.&lt;/p&gt;
&lt;h3&gt;Do not pressure developers to work faster&lt;/h3&gt;
&lt;p&gt;The business wants software produced as fast as possible, so it puts pressure on developers.&lt;/p&gt;
&lt;p&gt;Developers have only one way to deliver faster: drop the quality of the writing.&lt;/p&gt;
&lt;p&gt;So the software is now more buggy and less maintainable.&lt;/p&gt;
&lt;p&gt;Now the business pays the price of the bugs, which is enormous (annoyed customers, no satisfaction, no word of mouth etc.). Fixing bugs also gets exponentially costlier as time passes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixing a bug in the developer's machine costs ~2 minutes.&lt;/li&gt;
&lt;li&gt;Fixing a bug in the staging environment costs around an hour. One has to fix the bug, then deploy the fix, then let the customer know it got fixed.&lt;/li&gt;
&lt;li&gt;Fixing a bug in production takes a day in some cases, because data is already wrong for the users. If it's not a web app you also have to push a new version out and its adoption will vary according to the effectiveness of the software update system.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can sort of understand this if you think of an author writing a novel.
You as an editor tell the author to hurry up.
So the author forgets to do certain edits.
Now the character that got killed in chapter 6 suddenly reappers in chapter 18 without any explanation.&lt;/p&gt;
&lt;p&gt;In software this is much worse than in a novel.
To compare, you'd have to turn the novel into a virtual reality.
Now you have a Shrödinger's cat who is alive and dead at the same time.
What could be worse than that in software?&lt;/p&gt;
&lt;p&gt;But that is not the only bad consequence.
Badly written software is harder to change.
This means future tasks take much longer to accomplish.
So you thought you were saving some time, and maybe you did if lucky, but you've hurt the entire future of the project.&lt;/p&gt;
&lt;p&gt;Robert C. Martin expresses this concept best:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;"The only way to go fast is to go well."&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Pressure your developers and suffer the consequences.&lt;/p&gt;
&lt;p&gt;In Agile, the quality of the code is not negotiable.
It takes as long as it takes.
Bad managers need to get a clue.&lt;/p&gt;
&lt;h3&gt;Technical debt&lt;/h3&gt;
&lt;p&gt;No novel is written right the first time.
Every romance needs a few rewrites to become really good.
Software is similar.
Some parts of the software need to be reformulated, because it is impossible to get it right the first time.&lt;/p&gt;
&lt;p&gt;Even if you don't have bugs, you have badly written parts.
You are paying for these parts each time a developer needs to read them or change them.
So they are worth fixing even if the fix does not change the external behavior of the code.&lt;/p&gt;
&lt;p&gt;In a novel this would be the same as telling the same sequence of events, but telling it in a better way.
Maybe the order of the chapters change.
Maybe it's the vocabulary and the wording.
The story itself doesn't change, but the novel becomes much better.
Prevent the author from doing his rewrite, and you are hurting sales.
Also worth remembering: sales aren't the only thing that matters.&lt;/p&gt;
&lt;p&gt;Ward Cunningham is an Agile developer who is one of the creators of XP (Extreme Programming).
He also invented the wiki – the notion of a collectively edited website in which creating and linking pages is very easy to do.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://www.youtube.com/watch?v=pqeJFYwnkjE"&gt;this video&lt;/a&gt;, Cunningham talks about how he coined the famous metaphor of "technical debt" to explain to non-technical people the necessity of refactoring code.&lt;/p&gt;
&lt;p&gt;Basically, rushing the software out the door (badly written, hard to understand, hard to change) is initially good for business, but it is like taking a loan.
The debt must be repaid in the future, by spending time to refactor the software, so it becomes again easy to change.&lt;/p&gt;
&lt;p&gt;Woody Zuill expresses the same thing in more broader terms.
He says "teams and managers should &lt;a href="https://youtu.be/Jtt7PAejrFA?si=FHht24uOJ73sN_cJ&amp;amp;t=1844"&gt;spend the time to make the work easy to do&lt;/a&gt;".&lt;/p&gt;
&lt;p&gt;Refactoring, and fixing technical debt, is about making future work easy to do.&lt;/p&gt;
&lt;h3&gt;Truck number&lt;/h3&gt;
&lt;p&gt;Some teams have programmers "own" parts of the codebase.
Joe is the one who understands this area.
Sue is the one who can fix problems in this other area.
The devs are experts in parts of the code.&lt;/p&gt;
&lt;p&gt;That's the worst way to distribute expertise.
It results in low Truck Numbers.&lt;/p&gt;
&lt;p&gt;What is the smallest number of people in your project that, if hit by a truck, would put the project in trouble? That's your &lt;a href="https://wiki.c2.com/?TruckNumber"&gt;Truck Number&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If only Derek can manage the positronic code, then your Truck Number is one, and that is too low.&lt;/p&gt;
&lt;p&gt;The solution is obvious.
Nobody can "own" a part of the code.
The entire codebase is collective.
Everyone works on everything.&lt;/p&gt;
&lt;p&gt;This forces the team to share knowledge, resulting in a better team.&lt;/p&gt;
&lt;h3&gt;Pair programming&lt;/h3&gt;
&lt;p&gt;We have just seen how important it is for the development team to be constantly sharing knowledge.&lt;/p&gt;
&lt;p&gt;That is one reason to program in pairs.&lt;/p&gt;
&lt;p&gt;If an experienced dev works for a few hours with a novice, teaching is automatically taking place.&lt;/p&gt;
&lt;p&gt;There are more reasons, too.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The one on the keyboard (called driver) is helped by the other one, who does research as needed and removes other blocks.&lt;/li&gt;
&lt;li&gt;Better automated tests are written, since one remembers what the other one may forget.&lt;/li&gt;
&lt;li&gt;The code is examined by two people as it is being written. One sees the bugs of the other. The quality of the result is much higher, with much fewer bugs. No code review step is necessary.&lt;/li&gt;
&lt;li&gt;The alienation and isolation typical of a software development job are eliminated. People are interacting again. Having fun at work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is just one more strange thing for managers to realize.
Managers who don't know about pair programming think it's waste.
Two people doing the job of one.
Nothing further from the truth.&lt;/p&gt;
&lt;p&gt;Pair programming is one of the prescriptions of Extreme Programming, an Agile methodology.&lt;/p&gt;
&lt;h3&gt;Don't tell me how long it will take&lt;/h3&gt;
&lt;p&gt;After working with a software development team for a while, a manager begins to feel how easy or difficult tasks are going to be, even if she never does any task herself.&lt;/p&gt;
&lt;p&gt;Sooner or later she catches herself saying in a meeting, "I assume that's only going to take five minutes to do". That's natural, but please, blush when you say that.&lt;/p&gt;
&lt;p&gt;First of all, nobody knows how long it's going to take. Not even the developer. Because he hasn't done it yet. If it's more than changing static copy on screen, it could vary.&lt;/p&gt;
&lt;p&gt;Second, it's arrogant, defying and disrespectful.
Writing software is not frying pancakes.
More about this in the next post, about NoEstimates.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;If you've read this far, congratulations: You have just remembered universal truths about software development that have been known since 1975 at least. But these are frequently forgotten, which is a shame to those involved.&lt;/p&gt;</description><category>agile</category><category>computing</category><category>programming</category><guid>https://read.nando.audio/posts/counterintuitive.html</guid><pubDate>Thu, 24 Apr 2025 12:00:00 GMT</pubDate></item><item><title>How to hire a development team</title><link>https://read.nando.audio/posts/waterfall.html</link><dc:creator>Nando Florestan</dc:creator><description>&lt;p&gt;…So you are to manage some software creation. Then you must understand you cannot simply employ the same techniques used to manage other domains. Software creation is strange – many counterintuitive truths about it. You will fail unless you learn about these weird realities.&lt;/p&gt;
&lt;p&gt;This series contains these posts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://read.nando.audio/posts/waterfall.html"&gt;How to hire a development team&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://read.nando.audio/posts/counterintuitive.html"&gt;Counterintuitive facts of software development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://read.nando.audio/posts/no-estimates.html"&gt;No estimates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://read.nando.audio/posts/harmful-tools.html"&gt;On the use of harmful tools&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is the first of a series of posts for administrators, although programmers should read them, too.&lt;/p&gt;
&lt;h3&gt;The question&lt;/h3&gt;
&lt;p&gt;As a business person, you are focused on the big picture, and you need your contracts to be precise to avoid unpleasant surprises. So here is my question to you:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Would you hire a software development company that works via the Waterfall method?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Yes or no? Would you hire them to make software for you?&lt;/p&gt;
&lt;p&gt;If you don't know what Waterfall is, you are in the right place.&lt;/p&gt;
&lt;p&gt;By the way, the correct answer is no, you mustn't, because Waterfall is a severely obsolete way to develop software, and likely to fail hard. But Waterfall continues to be used today, since it feels comfortable to administrators who do not know certain strange facts about software development.&lt;/p&gt;
&lt;h3&gt;Waterfall&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Waterfall&lt;/strong&gt; means each development phase is done for the entire scope of the project and its output informs or cascades into the next phase:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;Requirement gathering &amp;amp; analysis ↘
   System architecture and design ↘
                    Implementation ↘
                            Testing ↘
               Delivery / deployment ↘
                            Maintenance
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The first phase, requirement gathering, results in a text that states the problem we are trying to solve.
This text is the basis for work on the second phase, design, which is done by business analysts interviewing workers in your company, and results in a text (and some diagrams) that state what the solution is going to look like.&lt;/p&gt;
&lt;p&gt;You pay for these 2 phases and, if you are happy with the proposal, you contract the team to actually develop the software for you.
So you start paying for development, but basically you don't talk to the developers anymore, for months or even years, until they finish their job and come back to show you the result.&lt;/p&gt;
&lt;p&gt;That output of the 2nd phase is the input for the 3rd phase, implementation, in which programmers make the software.
The application is the input for the 4th phase, testing, in which testers find bugs in the software and send those back to the programmers to fix.&lt;/p&gt;
&lt;h3&gt;Problems&lt;/h3&gt;
&lt;p&gt;When testers are happy, you go to a meeting and you see what they did.
Now you start pulling your hair because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Due to misunderstandings, what they are delivering is NOT what you asked for, months and months ago.&lt;/li&gt;
&lt;li&gt;Even if they had understood you, so many months have passed that what you asked for is no longer what you need. During this time, your business has evolved, your customers have changed, regulations have changed, the market has changed etc.&lt;/li&gt;
&lt;li&gt;There are features missing which are evident now, but nobody thought of then.&lt;/li&gt;
&lt;li&gt;The project is late and you have already been forced to negotiate the price, paying more for them to finish the job.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Historically, the Waterfall method had these serious problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It naively assumed that the system could be planned in its entirety; it did not foresee changes in scope.&lt;/li&gt;
&lt;li&gt;Each step took months to do, so projects could take years to complete.&lt;/li&gt;
&lt;li&gt;Clients did not participate in the development process, they only saw the finished project at the delivery phase.&lt;/li&gt;
&lt;li&gt;For lack of communication, clients felt what was delivered had almost nothing to do with what they had said they wanted.&lt;/li&gt;
&lt;li&gt;By the time the project was completed, the plans were obsolete: so much time had passed that the solution was born inadequate. Even if there had been no communication issue.&lt;/li&gt;
&lt;li&gt;Each phase was driven by fear of incompleteness. Most importantly, during the initial requirements gathering, clients tried to be as complete as possible in listing features, for fear of leaving out something important while they still could add scope without incurring costs. This resulted in implementation of many features that were never used in practice – an enormous waste of time and money. This problem is called "feature creep".&lt;/li&gt;
&lt;li&gt;Due to lack of communication and lack of trust, negotiation was hard. Clients simply wanted as much scope as possible for as little money as possible. It was hard for clients to understand why no software project can be delivered in the estimated time (more about this in another post). If legislation changed during the project execution and the scope had to change, a negotiation had to take place.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Software projects are very different from other projects. Software has weird characteristics that you, as a business person, must know about, if you are to succeed. This is what this small series of blog posts is about.&lt;/p&gt;
&lt;h3&gt;Fixing waterfall&lt;/h3&gt;
&lt;p&gt;Around the turn of the century, Waterfall was gradually abandoned, in favor of some Agile methodologies.
But here is the problem: Agile is hard to understand.&lt;/p&gt;
&lt;p&gt;Let's just try to begin to understand Agile.&lt;/p&gt;
&lt;p&gt;The word Agile does not mean faster. Nothing gets done faster.
It just means our reaction time is shorter.
When the environment demands we move in another direction, we are ready to do so.
We are a motorcycle, not a train.
A motorcycle is not necessarily faster than a train; it is more agile.&lt;/p&gt;
&lt;p&gt;What would &lt;strong&gt;you&lt;/strong&gt; do to fix Waterfall? I have shown you its problems; what do you do?&lt;/p&gt;
&lt;p&gt;Here are some obvious things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The client must participate all the time, not just at the beginning and at the end.&lt;/li&gt;
&lt;li&gt;There should be more communication.&lt;/li&gt;
&lt;li&gt;Planning should not be done only once at the beginning of the project.
    It should be done all the time, as reality changes and priorities shift.&lt;/li&gt;
&lt;li&gt;Place incentives to get rid of the fear of incompleteness.
    Tell them to make a small improvement and deliver it as soon as it is palpable to the user.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Therefore, when working with an Agile team:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You are required to enter another kind of contract, with variable scope, as opposed to the fixed scope of the Waterfall method.
    In other words, the contract does NOT say what the software is going to do.
    Nobody knows what the software is going to do, exactly.
    That's going to be discovered during the project.
    You pay for development time, not for a fixed scope.
    As an administrator, at first, you preferred a fixed scope, but now you know it would cause the project to fail.&lt;/li&gt;
&lt;li&gt;You accept a Minimal Viable Product (MVP), start using it, and work with the team in short iterations, giving them priorities and meeting to see increments in functionality.
    The most painful aspects of the current software will always be very obvious to you.&lt;/li&gt;
&lt;li&gt;You must stay in touch with the development team to fix misunderstandings early and provide an updated north to them. In fact, you are part of the development team.&lt;/li&gt;
&lt;li&gt;The team avoids Almighty Thud Methodologies.
    The Almighty Thud is the noise that the documentation makes when it drops on someone's desk.
    Documentation is not software, though. It is only valuable in small portions.&lt;/li&gt;
&lt;li&gt;Everyone must understand that the scope changing... is the norm, it is the most common thing in the world, it is not to be treated as an exception, but as a rule.
    ("Embrace change" is the subtitle of &lt;a href="https://www.goodreads.com/book/show/67833.Extreme_Programming_Explained"&gt;Kent Beck's 1999 book on XP&lt;/a&gt;.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now I want you to look at the phases of a project again, because it is impossible to change these:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;Requirement gathering &amp;amp; analysis ↘
   System architecture and design ↘
                    Implementation ↘
                            Testing ↘
               Delivery / deployment ↘
                            Maintenance
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Our purpose is to reach Delivery. But we can't deliver something that wasn't Tested.
And we cannot test something that was not Implemented.
And we shouldn't implement something that wasn't Designed.
And we cannot design something if we don't know what the problem is.&lt;/p&gt;
&lt;p&gt;Therefore, the steps above are the same in Agile – but they describe only one iteration of many in the project.
The iteration lasts only one or two weeks and works only on a small fraction of the system.&lt;/p&gt;
&lt;p&gt;In Waterfall, you might choose to hire testers only near the end of the project.
In Agile, everyone is working at the same time.
The pains of one role can immediately be conveyed to relevant others.
The system architect is immediately informed of the weaknesses in her architecture.
The business analyst is immediately informed of the weaknesses in her output.
The programmer immediately sees what kinds of bugs are being found by the tester.
Everyone gets opportunities to improve – immediately, not just at the end.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Instead of the feature creep characteristic of Waterfall, Agile prefers to deliver the smallest thing that has any value to the user as soon as possible.
    Even if it's just a single feature. The software is continually updated.&lt;/li&gt;
&lt;li&gt;We get feedback from the client and especially from users as early as possible and use that feedback in the following iterations.
    More likely that the right thing will be implemented. Less likely that unnecessary things will be implemented.&lt;/li&gt;
&lt;li&gt;Bring the client onto the development team, so there is transparency, they can actually see the hard work being done, they gain trust, and communication switches from negotiation mode to team mode.&lt;/li&gt;
&lt;li&gt;Even if communication fails hard at the beginning of the project, chances are it will improve and the right thing will be developed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When do you stop the project?
Well, it seems software needs to be maintained forever, to keep up with the times.
But for new features, you know when to stop.
Every two weeks you are focusing on adding the most important or most urgent feature(s).
So you stop adding features when the cost of development finally becomes higher than the benefit of the remaining features listed in the product backlog.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Maybe Waterfall can succeed for projects that are small enough or very easy to understand and describe. For instance, a device driver for a mouse. But most software projects aren't like that, and then you need something that deals with the actual challenges, and that's Agile.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://agilemanifesto.org/history.html"&gt;Since 2001 more or less&lt;/a&gt;, the software world started employing Agile methodologies. However, because of the exponential expansion of software, many do it without fully understanding it. Even today, many have heard the rooster announce dawn, but don't know where it is. They are just waking up to the new day.&lt;/p&gt;
&lt;p&gt;There is nothing on the horizon that can replace &lt;a href="https://agilemanifesto.org/principles.html"&gt;true Agile&lt;/a&gt;, there is no newer idea worth our time. Our current problem is that our Agile must be true, that's it.&lt;/p&gt;
&lt;p&gt;The next post will talk about other strange things typical of software development.&lt;/p&gt;</description><category>agile</category><category>computing</category><category>programming</category><guid>https://read.nando.audio/posts/waterfall.html</guid><pubDate>Wed, 23 Apr 2025 12:00:00 GMT</pubDate></item><item><title>Dart versus TypeScript</title><link>https://read.nando.audio/posts/dart-ts.html</link><dc:creator>Nando Florestan</dc:creator><description>&lt;p&gt;In recent posts I have shown that the web only has crummy technologies, but at the same time, Flutter deployed on the web is not yet free of its own crumminess, since it runs slower than in any other platform.&lt;/p&gt;
&lt;p&gt;In this post I shall convince you, beyond any doubt, that to develop frontends, you should use the Dart language rather than TypeScript.
We'll examine:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Problems with JavaScript&lt;/li&gt;
&lt;li&gt;Ignoring those problems like ostriches&lt;/li&gt;
&lt;li&gt;Problems with TypeScript&lt;/li&gt;
&lt;li&gt;Problems with functional languages&lt;/li&gt;
&lt;li&gt;Dart as a solution&lt;/li&gt;
&lt;li&gt;Problems with Dart&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;li&gt;Futurology&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;1. Problems with JavaScript&lt;/h3&gt;
&lt;p&gt;JavaScript was created in 10 days and now we have to tolerate it forever!?
&lt;a href="https://www.destroyallsoftware.com/talks/wat"&gt;WAT&lt;/a&gt;.
It is the only language I know with so many evil parts, other than &lt;a href="https://en.wikipedia.org/wiki/INTERCAL"&gt;INTERCAL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The best book about it is called "JavaScript – the good parts".
Everyone has read that book.
However, &lt;a href="https://www.youtube.com/watch?v=lc5Np9OqDHU"&gt;its author now says it's time to stop using the language&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The design problems in the JavaScript language are too numerous to list here, but here are some of the most egregious:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;this&lt;/code&gt; keyword&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Context sensitivity:&lt;/strong&gt; The value of &lt;code&gt;this&lt;/code&gt; can change depending on the context in which a function is called, leading to unexpected behavior and countless debugging sessions for thousands of developers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Binding issues&lt;/strong&gt;: Developers often need to use &lt;code&gt;.bind()&lt;/code&gt;, &lt;code&gt;call()&lt;/code&gt;, or &lt;code&gt;apply()&lt;/code&gt; to explicitly set &lt;code&gt;this&lt;/code&gt;, which is cumbersome and unheard of in any other major programming language.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Arrow functions:&lt;/strong&gt; Arrow functions do not have their own &lt;code&gt;this&lt;/code&gt; context, which can be both a benefit and a source of confusion when switching between arrow functions and regular functions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Arrow functions&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Implicit return:&lt;/strong&gt; The concise syntax can be misleading, especially with object literals, where {} is interpreted as a block rather than an object.&lt;/li&gt;
&lt;li&gt;Arrow functions do not have their own &lt;code&gt;arguments&lt;/code&gt; object, which can be limiting in certain scenarios.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No own &lt;code&gt;this&lt;/code&gt;:&lt;/strong&gt; While it solves some problems, it can also be confusing when developers expect a traditional function's &lt;code&gt;this&lt;/code&gt; behavior.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type coercion&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Implicit coercion:&lt;/strong&gt; JavaScript's automatic type conversion is a severe misfeature that leads to unexpected results, such as &lt;code&gt;'' + 1&lt;/code&gt; resulting in &lt;code&gt;'1'&lt;/code&gt; or &lt;code&gt;true + false&lt;/code&gt; resulting in &lt;code&gt;1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;== vs. ===&lt;/code&gt;:&lt;/strong&gt; The loose equality operator == performs type coercion, which can lead to unexpected results, whereas === does not, leading to a general preference for the strict equality operator but also to confusion among new developers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Classes and super()&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Syntactic sugar:&lt;/strong&gt; JavaScript classes are often criticized for being syntactic sugar over the prototype-based inheritance, which can lead to misconceptions about how inheritance works in JavaScript.
    In reality this is not a problem in itself, except for all the terrible implementation details in classes, &lt;code&gt;this&lt;/code&gt; and &lt;code&gt;super&lt;/code&gt;, which become a list of gotchas for developers to memorize.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mandatory call:&lt;/strong&gt; In a derived class, if you define a constructor, you must call &lt;code&gt;super()&lt;/code&gt; before you can use &lt;code&gt;this&lt;/code&gt;.
    Forgetting to do so results in a reference error.
    But worse, this means it is impossible to completely override a constructor in Javascript.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Order of initialization:&lt;/strong&gt; The call to &lt;code&gt;super()&lt;/code&gt; must happen before accessing &lt;code&gt;this&lt;/code&gt;, which can complicate constructor logic and initialization sequences, or even make one's idea impossible without a redesign.&lt;/li&gt;
&lt;li&gt;Classes in JS are so bad that most JS developers prefer to ignore them entirely.
    Instead, they achieve &lt;strong&gt;encapsulation by abusing closures&lt;/strong&gt;, which is in itself another terrible way to write software.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Module systems&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Due to historic reasons, JavaScript has multiple module systems (CommonJS, AMD, ES6 modules), which can be confusing and lead to compatibility issues.&lt;/li&gt;
&lt;li&gt;The final system (ES6 modules) has a &lt;code&gt;export default&lt;/code&gt; feature which I don't see in any other language, does not add value per se, and probably only exists to emulate the previous 2 module systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;JavaScript is a language notorious for its inconsistencies and flaws.
Despite possessing modern features, it suffers from fundamental issues that remain unresolved.
&lt;code&gt;this&lt;/code&gt;, &lt;code&gt;function&lt;/code&gt;, arrow functions, &lt;code&gt;super&lt;/code&gt;, and the, so to speak, excessively dynamic type system...
the behavior of these things is riddled with exceptions and unexpected outcomes.
Learning JavaScript often feels like memorizing a long list of workarounds.&lt;/p&gt;
&lt;p&gt;As a result, JavaScript is a language that makes kittens cry every day.
It is legitimately a language to be hated, if we are being reasonable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JavaScript is a hypocrite&lt;/strong&gt;, like a person who pays for expensive, albino-white facades on their front teeth, but leave their back teeth to rot full of caries.
JavaScript is the guy with a sports car who in truth is hurtful to women.&lt;/p&gt;
&lt;p&gt;People who decide to use JavaScript outside of the browser are backwards:
the browser should acquire a good language, instead of the worst language contaminating the entirety of computing.&lt;/p&gt;
&lt;p&gt;The real reason every other language compiles to JS, and the real reason WASM exists, is not a lack of cool new features in JS.
The real reason is that in JS, &lt;code&gt;this&lt;/code&gt; is broken, &lt;code&gt;function&lt;/code&gt; is broken, &lt;em&gt;arrow functions&lt;/em&gt; are broken, &lt;code&gt;super()&lt;/code&gt; is broken, the type system is broken...
To learn JS is to learn a pointless list of exceptions to expected behavior.&lt;/p&gt;
&lt;p&gt;Consequently, many developers choose to use languages that compile to JavaScript or explore alternatives like WebAssembly.
This trend highlights a critical issue:
&lt;strong&gt;JavaScript's fundamental flaws hinder development efficiency&lt;/strong&gt; and cost lots of time and money.&lt;/p&gt;
&lt;p&gt;As an example, here is a lesson for today:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Arrow functions cannot be constructors.&lt;/li&gt;
&lt;li&gt;Arrow functions do not inherit a &lt;code&gt;this&lt;/code&gt; binding; if they are part of an object, they cannot talk to it.&lt;/li&gt;
&lt;li&gt;Arrow functions don't provide &lt;code&gt;arguments&lt;/code&gt;; normal functions do.&lt;/li&gt;
&lt;li&gt;Named functions are hoisted, &lt;code&gt;const&lt;/code&gt; is not.
    Arrow functions were invented to be anonymous and to make small event handlers and callbacks, but people are abusing them and naming them with &lt;code&gt;const&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is just one confusing instance where JS has 2 ways of doing the same thing, both with advantages and disadvantages depending on what you are doing.
How much of this will you remember in 30 days?&lt;/p&gt;
&lt;p&gt;Why not pick a good language instead?&lt;/p&gt;
&lt;p&gt;In short, what needs to change in JavaScript is its WAT.
And while that doesn't happen, hordes of young programmers are learning a horrible programming language first.
Getting used to the most inelegant solutions.
Honestly, JavaScript has become the most popular programming language, and also the worst popular programming language.
The only things that are worse are those that are designed to be worse: esoteric programming languages like INTERCAL and Whitespace.&lt;/p&gt;
&lt;p&gt;But the worst part is, they seem to have &lt;strong&gt;given up fixing JavaScript&lt;/strong&gt;.
They have concluded it's impossible, due to the requirement of eternal backwards compatibility.
That is the wrong conclusion, and it shall be revised real soon now, as web development has clearly become unsustainable.&lt;/p&gt;
&lt;h3&gt;2. Ignoring those problems like ostriches&lt;/h3&gt;
&lt;p&gt;Most JavaScript developers are the proverbial boiled frog.
They have been studying this cursed language for years and years, why worry now?
"I am productive in JavaScript in spite of its shortcomings."
Their attitude is that of the ostrich: "learn the good parts", shun the bad parts, and develop code today.&lt;/p&gt;
&lt;p&gt;They will add, that all the alternatives to JavaScript are also doomed, for other reasons.
Maybe they are harder to debug in the browser.
Their performance is necessarily worse than JavaScript, since they compile to JavaScript.
And so on.&lt;/p&gt;
&lt;p&gt;In short, it's the famous &lt;strong&gt;Sunk Cost Fallacy&lt;/strong&gt;.
JavaScript is evidently not beneficial, but one sticks with it due to past investments.&lt;/p&gt;
&lt;p&gt;Where Python 3 focused on removing all the warts from Python 2 and succeeded, people imagine this to be impossible in JS, since they believe there is an &lt;strong&gt;eternal backwards compatibility requirement&lt;/strong&gt;.
I predict this requirement will drop very soon, as the accumulation of horrible web standards becomes a terrible burden.&lt;/p&gt;
&lt;p&gt;Yet, a successful precedent exists:
ActionScript 3 introduced class-based inheritance, separate from, and without disrupting, the existing prototype-based system.
This demonstrates that it's feasible to evolve a language without breaking existing code.&lt;/p&gt;
&lt;p&gt;Again: It is NOT impossible to fix JavaScript; the impossibility is an illusion that makes you accept JS.&lt;/p&gt;
&lt;p&gt;The only thing that is even more painful than fixing a floor full of rusty nails pointing up... is to forever tolerate it.
But that's exactly what a boiled frog does.
"I already know where the rusty nails are, I don't step on them anymore."&lt;/p&gt;
&lt;p&gt;This almost amounts to a Human Rights issue.&lt;/p&gt;
&lt;p&gt;My advice to you is: are you writing a large web app?
Then for the love of humanity, do it in anything but JavaScript.&lt;/p&gt;
&lt;h3&gt;3. Problems with TypeScript&lt;/h3&gt;
&lt;p&gt;There is a moderately popular project by Facebook called &lt;a href="https://flow.org/"&gt;Flow&lt;/a&gt;.
It lets you write static type annotations on otherwise JavaScript code, it checks the types as you write, and then it simply removes the type annotations in the end, leaving only your JS code.
I consider Flow a good design – if you need to write JS, that is.&lt;/p&gt;
&lt;p&gt;Microsoft answered the same question differently.&lt;/p&gt;
&lt;p&gt;They hired Anders Hejlsberg, the guy who had created Turbo Pascal and Borland Delphi, to make derived languages for them.
First they used him in their attempt to &lt;a href="https://en.wikipedia.org/wiki/Embrace,_extend,_and_extinguish"&gt;Embrace, Extend and Extinguish&lt;/a&gt; Java.
Microsoft then lost a tremendous lawsuit to Sun Microsystems for that misstep, so they turned to the next best war strategy: make their own Java while denying all influence.
Thus C# and the Dot Net Framework were born, or rather, cloned.
To this day these people are affirming that "C# belongs to the C family of languages", while it really is Java with a couple of misfeatures removed.
Hejlsberg was and is the main designer of C#.&lt;/p&gt;
&lt;p&gt;In 2012 Microsoft announced another Hejlsberg creation:
&lt;a href="https://www.typescriptlang.org/"&gt;TypeScript&lt;/a&gt;, which has become the most popular &lt;em&gt;compiles-to-js&lt;/em&gt; language.
But instead of just adding types to JS (&lt;a href="http://blog.namangoel.com/the-complicated-but-powerful-state-of-object-types-in-flow"&gt;like Flow does&lt;/a&gt;), it is a bastard child of JS and C#.
I imagine they gave Hejlsberg these contradictory goals:
"We want C# for the web, but it also must be a superset of JavaScript".
The superset bit means, if you paste JS into a TS file, it just works – all JS is valid TS.
It also means TS has its own separate features, augmenting JS.&lt;/p&gt;
&lt;p&gt;The fact is, this one-way compatibility with JS is probably why TS won.
But you know what I am going to say, right?&lt;/p&gt;
&lt;p&gt;TypeScript again decides not to fix any of the bad parts of JavaScript.
TypeScript is a monstrous creation, it adds even more cool features, such as algebraic types, without first fixing the basics.
The decision to be a superset of JS sealed TypeScript's fate; after that decision, being a good language was impossible.
It presents the best language features and the worst language features in a single thing.
TypeScript is the most hypocritic programming language in the world, and as such, it could only have been born at Microsoft.
Or Oracle, Apple, Facebook or Google.&lt;/p&gt;
&lt;p&gt;Learning TypeScript is learning tens of weird unexpected syntaxes in the type system – things that should be natural and much easier – and then forgetting them while you are coding.&lt;/p&gt;
&lt;p&gt;Every developer has noticed that, if TS seems powerful, it is because there's an enormous amount of features for annotating types.
It's not simple at all, it amounts to a tremendous cognitive burden.
And newer versions never simplify anything, they only add to that burden.
The developers of TypeScript take too much freedom to make it impossibly complex.
I have found this frustrating, and I am not alone:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://news.ycombinator.com/item?id=35892250"&gt;Rich Harris&lt;/a&gt;: "We also eliminate an entire class of annoying papercuts that will be familiar to anyone who has worked with the uneven landscape of TypeScript tooling."&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=IS_urQASlAM"&gt;Here is a video detailing the latest TS release&lt;/a&gt;.
And here are some YouTube comments sharing my sentiment:&lt;/p&gt;
&lt;p&gt;@tacochub4353: &lt;em&gt;These updates are neat... sure, but I don't really see how these methods solve the plethora of issues with using TypeScript.
All they seem to do is add unnecessary complexity to an already perplexing ecosystem filled with syntactical nuances.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;@JamesDSchw: &lt;em&gt;My beef with many TS releases over the years surround the cognitive load they incur - more syntax and language semantics to be able to model types in existing libraries in the ecosystem.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;@universe_decoded797: &lt;em&gt;Typescript solving things that are not problems to create more problems is problematic.
‘Simple things are hard to create’ is a true statement.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;In short, you wanted to fix JavaScript and suddenly you saw TypeScript.
It overloaded your senses with so much information and impression of power, that it seemed to be the right solution.
The only thing everyone forgot was the actual problem: we need to fix JS.&lt;/p&gt;
&lt;p&gt;To choose TypeScript, one must overlook two facts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;There is tremendous value in keeping language scope down to a minimum.
    Until Python 3.4 more or less, Python was a small language, any programmer could pick it up in a week by reading a 100-page description of the language.
    And then they could learn crucial parts of the standard library in a couple of months.
    One would become productive very quickly.
    Unfortunately, Python has entered a new phase, in which they forget the value of staying small and keep adding syntax.
    Becoming Scala, a language that one never finishes learning.
    If you are a Scala programmer and you start reading another developer's code, chances are, you have to stop and look up this syntax that is new to you.
    That is a horrible mistake.
    Back to TypeScript, it starts by accepting JavaScript, but then paradoxically it again becomes Scala by relentlessly adding features.&lt;/li&gt;
&lt;li&gt;We need a language that is a solid base to build upon; the perplexing crumminess of JavaScript is automatically unacceptable if mental health is a value.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;4. Problems with functional languages&lt;/h3&gt;
&lt;p&gt;It is currently my opinion that an object-oriented programming language is perfect for creating user interfaces, even a pure OO language such as Smalltalk.&lt;/p&gt;
&lt;p&gt;But here, let us ponder that an object-oriented approach greatly benefits from adopting a few lessons from functional languages.
Functional programming is not the opposite of object-oriented programming; to a certain extent these can be combined.
Also, object orientation today accepts that composition is better than inheritance most of the time.
I favor a pragmatic approach that uses notions from both these worlds.
Immutability only on certain kinds of information, and a conscious effort to create pure functions and unit tests for these – these are key to writing good code.&lt;/p&gt;
&lt;p&gt;But the current wave of functional programming languages is another thing that a healthy reader should doubt.
In about 15 years of people trying functional languages and immutability in the browser (either in JS or in functional languages such as Elm, Elixir and ReScript), the functional paradigm and the insistence on immutability have failed to deliver the cleanliness and developer productivity that were promised.&lt;/p&gt;
&lt;p&gt;Here are some arguments so we can establish that functional languages and techniques are not the panacea:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Complexity in state management&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;State overhead:&lt;/strong&gt; Functional programming emphasizes immutability, leading to frequent state copies. This can increase memory usage and overhead, unless the collections in the language are carefully made to avoid this problem (such as in Clojure).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verbose code:&lt;/strong&gt; Functional paradigms often require more boilerplate code to manage state changes in an immutable manner compared to traditional imperative approaches, unless this is addressed in the language design (such as in Clojure).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Business Logic Complexity:&lt;/strong&gt; For complex business logic, imperative programming often provides more straightforward solutions, whereas functional programming can lead to overly abstract and convoluted code. Unless the language is data-centric (such as Clojure).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Steep learning curve&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Conceptual barrier:&lt;/strong&gt; Functional programming concepts like higher-order functions, monads, and pure functions can be difficult for developers to grasp, purity being the easiest. Mathematical concepts are of course beautiful in computing, but they simply are not the way most people communicate – and the web should be for everyone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Limited adoption:&lt;/strong&gt; The steep learning curve has hindered widespread adoption, making it harder to find developers skilled in functional programming, which impacts team productivity.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance concerns&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Inefficiency in browsers:&lt;/strong&gt; Functional programming can introduce performance issues in the browser, such as excessive garbage collection due to frequent object creation from immutable state changes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lack of optimization:&lt;/strong&gt; JavaScript engines are primarily optimized for imperative code, potentially leading to less efficient execution of functional code.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;While above I have tried my best to talk ill of functional languages… knowing what I know today, to develop user interfaces, I would reach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;first for a functional language that is conscious of, and addresses, the pitfalls above (such as Clojure);&lt;/li&gt;
&lt;li&gt;then for a multi-paradigm expressive language such as Python, Dart or Kotlin;&lt;/li&gt;
&lt;li&gt;then for a pure OO language such as Smalltalk;&lt;/li&gt;
&lt;li&gt;then for a hybrid functional language such as ReScript, OCaml or F#;&lt;/li&gt;
&lt;li&gt;then for an opinionated, pure functional language such as Elm or Haskell;&lt;/li&gt;
&lt;li&gt;then for anything else in existence;&lt;/li&gt;
&lt;li&gt;before resigning myself to use TypeScript or JavaScript with their broken basics.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. Dart as a solution&lt;/h3&gt;
&lt;p&gt;In 2009, Node.js brought JavaScript to the server, and now boiled frogs write their backend and frontend in the same language: the worst one.
Someone help them!&lt;/p&gt;
&lt;p&gt;Seeing this, Google unveiled their Dart language in 2011.
You can think of it as the last Java clone, this time with better influences.
Dart 1.0 came out on November 2013.&lt;/p&gt;
&lt;p&gt;The initial plan for Dart was to include it in Chrome as a second native browser language, the good brother of JavaScript.
This was criticized for fragmenting the web, so they gave up this idea in 2015 at the release of Dart 1.9.
And then Google proceeded to dominate the web anyway – through countless bad standards – such that now it is financially impossible for anyone else to develop a new browser.
We might as well have had Dart in Chrome, it would have been a tremendous blessing all these years.&lt;/p&gt;
&lt;p&gt;There exists a parallel universe in which the frontend community gladly accepted Dart as their saviour when Google proposed it as a sane, parallel native language in the browser.
I wish I lived in that universe.
Frontend devs, you have Stockholm Syndrome.&lt;/p&gt;
&lt;p&gt;Instead, Dart was sort of forgotten for a couple of years while Flutter was being developed.
It was released in 2018.&lt;/p&gt;
&lt;p&gt;Here are reasons why Dart is good for developing applications and GUIs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It has none of JavaScript's defects.&lt;/li&gt;
&lt;li&gt;It is essentially just another boring multi-purpose Java clone with a few saving graces.&lt;/li&gt;
&lt;li&gt;It has null safety.&lt;/li&gt;
&lt;li&gt;It has a good, pragmatic type system without any trace of TypeScript complications.
    Something that just helps programmers instead of stealing their attention.&lt;/li&gt;
&lt;li&gt;It has garbage collection.&lt;/li&gt;
&lt;li&gt;Very performant for a garbage-collected language.
    You can roughly think of Dart as 10 times faster than Python and 10 times slower than C++.&lt;/li&gt;
&lt;li&gt;It runs on every platform; it can also compile to JS.&lt;/li&gt;
&lt;li&gt;It is now beginning to compile to WebAssembly and even use its garbage collector – this makes the runtime smaller.&lt;/li&gt;
&lt;li&gt;It is being developed at a nice pace.&lt;/li&gt;
&lt;li&gt;It has a moderate, good enough syntax size; it does not seem to want to become Scala.&lt;/li&gt;
&lt;li&gt;It has features to write constructors without so much boilerplate, making Java look silly. However, Python is still better in this regard.&lt;/li&gt;
&lt;li&gt;In fact, in some places it has been smarter than Java and C#.
    For instance, it does not have the &lt;code&gt;private&lt;/code&gt;, &lt;code&gt;protected&lt;/code&gt; and &lt;code&gt;public&lt;/code&gt; keywords; instead, the programmer simply starts a variable name with an underscore (such as &lt;code&gt;_myVariable&lt;/code&gt;) and that makes the variable private to the current file.
    This is great language design, removing lots of noise in a single movement.&lt;/li&gt;
&lt;li&gt;Developer productivity and comfort are higher in a no-nonsense, immediately familiar language.&lt;/li&gt;
&lt;li&gt;If you learn Dart, you are learning the language of Flutter.
    If you write the core of your web app in Dart, you can later reuse some of that core in a mobile app.
    And Flutter is much better than React Native... because React Native is based on JS/TS, and its misarchitecture consists of letting you use crummy web technologies such as CSS (or rather, just an arbitrary subset of these technologies) which then get translated into native widgets.
    It is just a fundamental lie, designed to keep web developers in their narrow comfort zone.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;6. Problems with Dart&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Metaprogramming/reflection is currently weak in Dart, but being worked on right now (2024), with macros in the roadmap for the next few releases.&lt;/li&gt;
&lt;li&gt;Interop with JavaScript is more difficult than expected.
    Using a JS library in Dart code is fine, but you have to write typing stubs for the library's interface.
    Consuming Dart code from JS requires you to expose objects and functions with a decorator, and I don't think you currently can expose them in a JS module, so you have to put the API on the window object, which feels outdated.&lt;/li&gt;
&lt;li&gt;Indentation with only 2 spaces is hard to see.&lt;/li&gt;
&lt;li&gt;It uses curly braces instead of significant indentation. (Significant whitespace is objectively better because it communicates the same information with less visual noise and occupies fewer lines.)&lt;/li&gt;
&lt;li&gt;It requires semicolons.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Given the above, I would definitely write web apps in Dart, especially using its numerous frameworks for doing so; I would also write a large app component to be consumed by JS through a relatively small interface; but I would not write a typical JS library in Dart, unfortunately.&lt;/p&gt;
&lt;h3&gt;7. Conclusion&lt;/h3&gt;
&lt;p&gt;Going parallel to JS is unavoidable, that is why everyone wants Web Assembly to succeed: it's the only escape.&lt;/p&gt;
&lt;p&gt;Dart is not perfect, but programming in it is bliss compared to JavaScript and TypeScript.
There are alternatives out there; your responsibility is to choose something better than what everyone else is using, if you are smart.&lt;/p&gt;
&lt;h3&gt;8. Futurology&lt;/h3&gt;
&lt;p&gt;The feared web fork is soon going to be required, and for all Web tech, not just JavaScript.
Because the powers that be have introduced an enormous number of spectacularly failing standards:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;HTML that is not XML&lt;/li&gt;
&lt;li&gt;CSS, which again is growing impossibly as a language, is impossibly complex in the interaction of its features, contains an impossible number of footguns, and is already humanly impossible to learn for its target audience of designers and common people&lt;/li&gt;
&lt;li&gt;Web Components (Custom Elements), which are enormously complex, have a terribly verbose API, yet somehow manage to fail at addressing basic concerns of writing GUIs&lt;/li&gt;
&lt;li&gt;IndexedDB, the only way for frontend devs to access a SQLite database, has a horrendous API, so nobody uses it&lt;/li&gt;
&lt;li&gt;...?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The idea that these bad standards, plagued by complexity and inconsistencies, must remain in the Web forever for backwards compat is absurd and impossible.
Of course one day this entire mess will be dropped.&lt;/p&gt;
&lt;p&gt;The web platform has become so convoluted that only tech giants can afford to build browsers.
This centralization of power threatens the open nature of the web.&lt;/p&gt;
&lt;p&gt;When Firefox finally finishes failing, we'll be in the impossible situation of every browser being based on Chromium.
This is due to the number of incredibly complex features and standards that a browser must implement.
Thus the web no longer belongs to the people, it belongs to tech giants.&lt;/p&gt;
&lt;p&gt;I am calling this right now: soon the people will create a "New Simple Web", from scratch, with simpler (but not necessarily more powerful) technologies, languages and protocols, to replace this Impossibly Big Ball of Backwards Compatible Spaghetti.
This revolution will be painful in many ways, but it is clearly unavoidable.
The most important values for the right technologies, languages and protocols will not be power, but cleanliness, simplicity and developer experience.&lt;/p&gt;
&lt;p&gt;I believe the New Simple Web will look more like Flutter than anything else.
It will be based on a single good language.
No separate language for formatting.
It will tend to the pragmatic needs of writing applications.
But it will still somehow make contents public, as they are today.
Oh, and it will have no DRM.&lt;/p&gt;
&lt;p&gt;In order to become popular, the New Simple Web will have to offer something to the users, too.
Evidently, that something will be their freedom.
By then Google will already be the distopian oppressive OCP they have decided to become, so they will be closing everything on the Web: mandatory ads, mandatory privacy invasion, mandatory taxes, mandatory DRM protecting THEIR content which they actually stole from books, poorly paid videomakers etc... you name it.
This is what Chrome will be.&lt;/p&gt;
&lt;p&gt;Other tech giants will try to create an Alternative Web in advance, but they will not provide the necessary freedom, and therefore they will fail.&lt;/p&gt;
&lt;p&gt;Someone will rise to the challenge, present a clear picture of how the New Simple Web should be built, and do it.
People will use Chrome for banking and gradually migrate to the New Simple Web for everything else.&lt;/p&gt;
&lt;p&gt;And then the cycle will begin again, inasmuch as humans are bound to forget learned lessons.&lt;/p&gt;</description><category>computing</category><category>dart</category><category>programming</category><category>typescript</category><guid>https://read.nando.audio/posts/dart-ts.html</guid><pubDate>Tue, 06 Aug 2024 12:00:00 GMT</pubDate></item><item><title>You're too quick to dismiss Agile</title><link>https://read.nando.audio/posts/agile.html</link><dc:creator>Nando Florestan</dc:creator><description>&lt;p&gt;I see too many programmers today thinking that Agile is nonsense. &lt;a href="https://www.youtube.com/watch?v=vcuw5UNw4jU"&gt;It has even become an opportunity to sell books on esoteric methodologies.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;However, there's widespread confusion:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;about what Agile actually proposes,&lt;/li&gt;
&lt;li&gt;about how bad the alternative is,&lt;/li&gt;
&lt;li&gt;about what our personal experience really is – usually with Scrum.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;First of all, let's quickly remember what Agile really is: a reaction to Waterfall.&lt;/p&gt;
&lt;p&gt;I have &lt;a href="https://read.nando.audio/posts/waterfall.html"&gt;another post that defines Waterfall and begins to explain Agile as a reaction to it&lt;/a&gt;. You should start there; maybe that's where the confusion will vanish.&lt;/p&gt;
&lt;h3&gt;The manifesto&lt;/h3&gt;
&lt;p&gt;Please refer to the original Agile Manifesto, which is about 5 lines long:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://agilemanifesto.org/"&gt;https://agilemanifesto.org/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It simply means that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;processes and tools are important, but individuals and interactions are more important.&lt;/li&gt;
&lt;li&gt;comprehensive documentation is important, but working software is more important.&lt;/li&gt;
&lt;li&gt;contract negotiation is important, but customer collaboration is more important.&lt;/li&gt;
&lt;li&gt;following a plan is important, but responding to change is more important.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You see, it's extremely hard to disagree with anything the manifesto actually says.&lt;/p&gt;
&lt;p&gt;For example, notice how the manifesto didn't prescribe any meetings. The meetings that developers complain about so much are usually the Scrum meetings. Therefore, they are not a part of Agile itself. One can develop software well while organizing one's meetings in a different way.&lt;/p&gt;
&lt;p&gt;But what some programmers really want is to develop software without communicating at all; that's impossible, and therefore, their own mistake.&lt;/p&gt;
&lt;h3&gt;Scrum&lt;/h3&gt;
&lt;p&gt;Scrum is a modern development methodology, appropriate for developing products of any kind, not just software.
Scrum does not actually say anything specific about software development.&lt;/p&gt;
&lt;p&gt;However, it prescribes a set of meetings.
If you don't have your meetings that way, then you are not doing Scrum, you are doing something else.
We just saw that Agile values individuals and interactions over processes; therefore each team should have sovereignty over their meetings and should only do Scrum meetings if they think that's appropriate for the specific team. Therefore, Scrum is already not following Agile in principle by demanding those meetings – although the ideas in Scrum can be employed in Agile!&lt;/p&gt;
&lt;p&gt;The meetings in Scrum do address a tendency that software developers have, to not communicate enough (or sometimes at all) between themselves.
If left unchecked, this tendency is enormously dangerous to the health of any project.
We'll talk about this again below (XP).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://scrumguides.org/index.html"&gt;The Scrum Guide&lt;/a&gt; (2009-2020) is another document that is very brief (12 pages) and easy to read.
Again, you might be surprised at the things it &lt;strong&gt;doesn't&lt;/strong&gt; say.
For instance, Kanban and Planning Poker are &lt;strong&gt;not&lt;/strong&gt; necessarily a part of Scrum.
Scrum does not prescribe how the product backlog should be organized or how the team actually decides what to include in the next sprint.
You might be surprised at how democratic it really is, if you read it.&lt;/p&gt;
&lt;p&gt;I have worked in several bad Scrum implementations, each with their own troubles. However, I do know from experience that Scrum can work wonderfully well, because I have been part of a good Scrum implementation. Its democratic nature kept the entire team quite enthusiastic about their work.&lt;/p&gt;
&lt;p&gt;Scrum is a humanistic revolution in the workplace. It inverts the hierarchy. If in the 80s you had quite bossy bosses bossing workers around, Scrum says, bosses are out. Scrum teams have no boss; there is only a facilitator, who is supposed to give workers freedom to do the work the way they want to do it. The role of the facilitator is actually to help the workers, for instance by removing obstacles (institutional, physical etc.) that hinder their best work. This creates an engaged team where before you only had begrudging employees. The Scrum team is self-managing.&lt;/p&gt;
&lt;p&gt;"But in my experience Scrum is a tool of domination", you say. Well, did you experience actual Scrum, or a bastardized "version" that actually contradicts its principles?&lt;/p&gt;
&lt;p&gt;If you are going to criticize Agile or Scrum, first understand what each actually says. Most often, you'll realize your trouble is with the implementations you've had the misfortune of experiencing.&lt;/p&gt;
&lt;p&gt;If you pay attention to the &lt;a href="https://en.wikipedia.org/wiki/Scrum_(software_development)#History"&gt;history of Scrum&lt;/a&gt;, you realize there are at least 2 Scrums:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The 1986 one, from the paper "The New New Product Development Game" by Hirotaka Takeuchi and Ikujiro Nonaka;&lt;/li&gt;
&lt;li&gt;The famous one, from Schwaber and Sutherland in 1995. Both authors are also signataries of the 2001 Manifesto for Agile Software Development. But the Scrum Guide only appeared in 2009.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is important to notice that the lineage of thought is different for Scrum – it originated in Toyota, not in software development. Quoting the above Wikipedia article about the Japanese original Scrum:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Based on case studies from manufacturing firms in the automotive, photocopier, and printer industries, the authors outlined a new approach to product development for increased speed and flexibility. They called this the rugby approach, as the process involves a single cross-functional team operating across multiple overlapping phases, in which the team "tries to go the distance as a unit, passing the ball back and forth". The authors later developed scrum in their book, The Knowledge Creating Company.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;What I can see Scrum has in common with Agile is the humanistic aspect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;individuals and interactions over processes and tools&lt;/li&gt;
&lt;li&gt;collaboration over negotiation – this time within the team.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Extreme Programming (XP)&lt;/h3&gt;
&lt;p&gt;XP is the actual first Agile methodology for software development specifically.
This is the one that was made by programmers, for programmers.
It was developed by Kent Beck and his team from 1996 to 1999, when he wrote &lt;a href="https://www.goodreads.com/book/show/67833.Extreme_Programming_Explained"&gt;Extreme Programming Explained&lt;/a&gt;.
That team included these guys who also signed the Agile Manifesto:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Kent_Beck"&gt;Kent Beck&lt;/a&gt;, inventor of XP&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.c2.com/?WardCunningham"&gt;Ward Cunningham&lt;/a&gt;, the inventor of the wiki&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ronjeffries.com/"&gt;Ron Jeffries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most of the ideas in the Agile Manifesto are already found in XP.&lt;/p&gt;
&lt;p&gt;XP described most of the software development practices that won and are in use today:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;writing &lt;em&gt;automated tests&lt;/em&gt; and using them to get the courage to refactor existing code freely, without worrying about breaking everything&lt;/li&gt;
&lt;li&gt;&lt;em&gt;refactoring&lt;/em&gt; before implementing a new feature, so it becomes easier to implement&lt;/li&gt;
&lt;li&gt;&lt;em&gt;delaying decisions&lt;/em&gt; when possible&lt;/li&gt;
&lt;li&gt;&lt;em&gt;pair programming&lt;/em&gt; to improve team communication, disseminate knowledge amongst team members, and to severely improve code quality, killing bugs immediately&lt;/li&gt;
&lt;li&gt;writing only documentation that you actually need and can keep up-to-date&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;XP was revolutionary, especially when compared to &lt;a href="https://martinfowler.com/distributedComputing/thud.html"&gt;Almighty Thud methodologies&lt;/a&gt; which emphasized writing lots of documentation, which were the norm in the Waterfall era. (The Almighty Thud is the name for the noise made by the volume of paper documentation hitting one's desk.)&lt;/p&gt;
&lt;p&gt;In fact, XP is still revolutionary, inasmuch as you haven't yet personally practiced its propositions.&lt;/p&gt;
&lt;h3&gt;Software is a tamagotchi&lt;/h3&gt;
&lt;p&gt;The main conflict I see in software development is this:
Agile promises continuous delivery of value (something like delivering features all the time), but software development simply isn't like that.&lt;/p&gt;
&lt;p&gt;Expecting a development team to deliver only features all the time is as realistic as expecting a human being to be of service to their significant other all the time.
The reality is, the human and the team need some time to themselves.&lt;/p&gt;
&lt;p&gt;Business people start with this idea that software is a project with a beginning and an end.
"I will develop an app, then sit back and profit." Nothing could be further…&lt;/p&gt;
&lt;p&gt;Reality is like Chacon said:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Software is a tamagotchi. It has its own needs, that must be tended to.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The problem is, business people cannot see the virtual pet or its demands, if they cannot program.
A programmer can try to explain it to them, but they get bored quickly.&lt;/p&gt;
&lt;p&gt;This tamagotchi is a mythical creature. Only little children can see E. T., grownups cannot. And only developers can see the needs of the software; they are invisible to the marketing team.&lt;/p&gt;
&lt;p&gt;This past week I upgraded packages in our Linux servers because of the recently discovered &lt;a href="https://www.youtube.com/watch?v=2Ig05_aL4Xg"&gt;openssh vulnerability&lt;/a&gt;. If you have servers, you have to be on top of security, there is no alternative.&lt;/p&gt;
&lt;p&gt;— Yeah, but as a business person, I absolutely CAN see the value and importance in that work, since not having our users' passwords stolen is a major component of their satisfaction.&lt;/p&gt;
&lt;p&gt;Okay, then I suppose &lt;em&gt;sometimes&lt;/em&gt; you can see the tamagotchi demanding we do things that our users are completely unaware of.&lt;/p&gt;
&lt;p&gt;Let me try another example then. We really have to do some work on the way we use our asynchronous queue system. You see, things like sending emails, talking to external APIs, anything that isn't instantaneous... these things are done in separate processes, in a queue. That queue is known as FIFO, which means First In, First Out, which means first come, first served. The queue is a buffer for tasks that the app needs to do. But the queue has certain features that we need to start using in order not to have problems in it, which would be a terrible situation.&lt;/p&gt;
&lt;p&gt;— That's too technical for me, you seem to be saying words. If I were to prioritize that work, I think I would actually never prioritize it, I think, because I have features that our users actually want, and those I do understand.&lt;/p&gt;
&lt;p&gt;…and this is an example of the virtual pet dying of starvation, because the parents didn't understand its importance.&lt;/p&gt;
&lt;h3&gt;Technical debt&lt;/h3&gt;
&lt;p&gt;It is a terrible thing, when instead of the whole team choosing what needs to be done in the next sprint, it gets dictated by a non-technical Product Owner who leaves technical debt on the wall forever gathering spiders' webs, until it falls on the ground and gets swept away by someone who doesn't think they are important.&lt;/p&gt;
&lt;p&gt;A good rule for solving technical debt had already been proposed in XP: &lt;strong&gt;refactor before you implement a new feature.&lt;/strong&gt; This means, remove the technical debt that affects the feature you are about to implement. It also means, leave alone the technical debt that does not affect the code you need to change. Some technical debt exists in code that never gets changed, and that is okay if the code is working fine.&lt;/p&gt;
&lt;p&gt;By the way, bugs are not technical debt, bugs are bugs. Bugs annoy users, technical debt "only" annoys developers. Generally, solving bugs is the most important priority, because if you leave bugs alone, they start compounding. Then when you finally decide to kill them, you can't tell anymore where one starts and ends, because they have become this multi-headed monster. Nobody can understand the behavior of a buggy system; a sane mind can only understand sane behavior.&lt;/p&gt;
&lt;p&gt;However, annoying developers is a terrible thing too, and that is what business people don't understand.&lt;/p&gt;
&lt;h3&gt;Clean code&lt;/h3&gt;
&lt;p&gt;There's a second document about Agile, also very brief, which tries to clarify the Agile Manifesto. It's the &lt;a href="https://agilemanifesto.org/principles.html"&gt;12 Principles behind the Agile Manifesto&lt;/a&gt;. Again I invite you to read them.&lt;/p&gt;
&lt;p&gt;Here's a bit I would like to emphasize:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Agile processes promote sustainable development.
The sponsors, developers, and users should be able
to maintain a constant pace indefinitely.
Continuous attention to technical excellence
and good design enhances agility.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This means, agile is not supposed to be a tool against developers. This means the maintainability of the code is valuable, and important to agility.&lt;/p&gt;
&lt;p&gt;Any psychologist will tell you, before you can love other people, you need to actually love yourself.&lt;/p&gt;
&lt;p&gt;As a developer, each day you must do something to improve your own life. Nobody else is going to do that for you. They will even have difficulty understanding that an annoyed programmer is a much slower programmer, naturally and for good reason. It's hard to put something in production when you can't get past development.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Martin_Fowler_(software_engineer)"&gt;Martin Fowler&lt;/a&gt;, a famous and respected British author who writes the best descriptions of ideas in software development, while offering the sanest opinions, went through the trouble of cataloguing and describing the various refactorings, in his famous 1999 book &lt;em&gt;Refactoring&lt;/em&gt;. He is also one of the first signataries of the Agile Manifesto.&lt;/p&gt;
&lt;p&gt;Why would he write &lt;em&gt;Refactoring&lt;/em&gt; if technical debt were not important enough to fix???&lt;/p&gt;
&lt;p&gt;Oh, and &lt;a href="https://martinfowler.com/bliki/TechnicalDebt.html"&gt;here&lt;/a&gt; is his description of technical debt.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Robert_C._Martin"&gt;Robert C. Martin&lt;/a&gt;, a very important author whose name you also find under the Agile Manifesto, is sort of saying the same thing, when he says, &lt;em&gt;the only way to go fast, is to go well&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;A large application cannot be built without lots of discipline. A mature programmer knows this and takes pride in the discipline, just like a practitioner of martial arts or a musician.&lt;/p&gt;
&lt;p&gt;Robert C. Martin, in fact, goes beyond the XP rule. He notices that people are about to start dying due to badly written software, or maybe already are dying. So he says, when the thing works, do not stop and deliver it. When the thing works, you are only half done. Now you have to clean it up. Remove all the technical debt, make it easy for other programmers to understand. Make it easy even for you yourself to understand it after 2 months! Remove the useless tests, finish writing the good ones. Refactor the spaghetti, rename the badly named functions. Treat your program like a poem.&lt;/p&gt;
&lt;p&gt;If the company places excessive pressure on developers, it is an engineer's duty to be firm and say no, especially if people's health is directly or indirectly at stake. This is the ultimate test of a true professional. You do know that "I was just following orders" does not convince. Show some character strength when your turn comes.&lt;/p&gt;
&lt;p&gt;If developers do not self-police in this way, people will die due to buggy programs, and then the legislators will legislate software development, and the result will be much worse. This is what Martin says, and it's hard to disagree.&lt;/p&gt;
&lt;p&gt;As a developer, do love your users, but love yourself first. You can't be of use to your users, or the company, or your family, if your software becomes unmaintainable.&lt;/p&gt;
&lt;p&gt;In other words, no matter how much you love your user, you can't be used by him all day long!&lt;/p&gt;
&lt;p&gt;When a musician gets popular, she often needs to put her foot down and say "no, only 2 shows a week maximum and that's final". Otherwise there's no time to hone her craft. These companies always want you for what you already know, but never want you to spend any time learning what you need to learn to stay relevant. It's up to you to draw the line.&lt;/p&gt;
&lt;p&gt;According to Woody Zuill, teams and managers should &lt;a href="https://youtu.be/Jtt7PAejrFA?si=FHht24uOJ73sN_cJ&amp;amp;t=1844"&gt;spend the time to make the work easy to do&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Allen Holub has a &lt;a href="https://holub.com/heuristics/"&gt;heuristics page in which he briefly explains agile in his own words&lt;/a&gt;. At the time I am writing, number 15 reads: "Quality is not negotiable. (This rule applies to all aspects of quality, not just testing.)"&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;When bad managers use Scrum against developers and basic development needs, that is in fact against Agile principles.&lt;/p&gt;
&lt;p&gt;A solution for our woes will be found in a proper implementation of Agile ideas – not in mistakenly escaping those ideas as if something better existed out there.&lt;/p&gt;
&lt;p&gt;Mind the gurus you choose. Digital influencers can be entertaining and arouse emotions, but &lt;a href="https://www.youtube.com/watch?v=kn59Yn55Pos"&gt;some of their advice is terribly misguided&lt;/a&gt;. To them, all the names in this article are preferable.&lt;/p&gt;</description><category>agile</category><category>computing</category><category>programming</category><guid>https://read.nando.audio/posts/agile.html</guid><pubDate>Sun, 07 Jul 2024 12:00:00 GMT</pubDate></item><item><title>Risks of adopting Flutter</title><link>https://read.nando.audio/posts/adopting-flutter.html</link><dc:creator>Nando Florestan</dc:creator><description>&lt;p&gt;&lt;a href="https://read.nando.audio/posts/crummy-web-tech.html"&gt;My previous post&lt;/a&gt; ended by recommending "something like Flutter" against the crumminess of web tech. But it is not that simple.&lt;/p&gt;
&lt;p&gt;First of all, Flutter's performance on the web is much worse than on the other platforms it supports. And this year (2024) this is not going to change because the Flutter developers said they are not working on it right now.&lt;/p&gt;
&lt;p&gt;That is enough to rule out Flutter on the web, I think. But suppose that weren't the case. Here are more thoughts about it.&lt;/p&gt;
&lt;h3&gt;The argument against Flutter&lt;/h3&gt;
&lt;p&gt;Google kills its projects without mercy. The &lt;a href="https://gcemetery.co/"&gt;Google Cemetery website&lt;/a&gt; lists tens of such projects.&lt;/p&gt;
&lt;p&gt;It is about this risk that David Heinemeier Hansson wrote &lt;a href="https://x.com/dhh/status/1790501976733807078"&gt;something I have to quote in its entirety&lt;/a&gt;:&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;The saying "nobody ever got fired for buying IBM" is at its essence about risk management. The traditional wisdom goes that if you buy from a big company, you're going to be safe. It may be more expensive, but big companies project an image of stability and reliability, so buying their wares is seen as the prudent choice. Except, it isn't. Certainly not any more. Meta killing Workplace is merely exhibit #49667.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Any company that hitched their wagon to Workplace just got served with an eviction notice. In a about a year, the data will go read-only, and shortly after that, it's game over. Now companies from Spotify to McDonalds, along with millions of others, have to scramble to find an alternative. Simply because Meta can't be bothered to maintain a platform that's merely used by millions when their consumer business is used by billions.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This, right here, is the risk of buying anything from big tech like Meta and Google. Their main ad-based cash cows are so fantastically profitable that whether it's the millions of paying accounts on Workplace or the millions of live websites once hosted by Google Domains, it all just pales in comparison, and is thus one strategy rotation away from being labeled "non-core" and killed off.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Buying from big isn't the sure bet they want you to believe. Buy from someone who actually needs your business to make the wheels go round.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;How can you be sure Flutter is going to stay around?  If Google dropped it, I doubt the open source community would be able to maintain it, just because it is a project that targets many platforms and requires many different kinds of expertises. It definitely would require professional organization similar to the Linux kernel or things like Gnome and KDE.&lt;/p&gt;
&lt;h3&gt;Arguments in favor of Flutter&lt;/h3&gt;
&lt;p&gt;If you follow DHH's advice and choose something from smaller companies, guess what, many of these aim to be bought, and then the rug gets pulled from under you anyway. If Microsoft buys the product, it starts to get worse with each update. But normally the product is bought to be killed. So the risk must be managed taking much more into account than just company sizes.&lt;/p&gt;
&lt;p&gt;The price of Flutter is right for everyone. (Zero.) Xamarin used to offer a comparable product for cross-platform development which cost a thousand dollars per developer per year. And then &lt;a href="https://www.bairesdev.com/blog/what-is-xamarin/"&gt;Xamarin was bought by Microsoft and the product was included into Microsoft's own&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cross-platform development solutions being offered by smaller organizations (that I know of), such as Qt and &lt;a href="https://kivy.org/"&gt;kivy&lt;/a&gt;, &lt;a href="https://www.reddit.com/r/kivy/comments/hmfj7l/deploy_kivy_app_as_a_web_app_possible_how/"&gt;do not seem to be equal in scope&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I should also clarify that Flutter is NOT a toy. The most recent figure is that one million applications have been built with it. That is a very significant number in the mobile space. No other cross-platform toolkit has that number.&lt;/p&gt;
&lt;p&gt;Incredibly relevant to the question of "what tech to use" is the advice given in the famous article &lt;a href="https://paulgraham.com/avg.html"&gt;"Beating the Averages", by Paul Graham&lt;/a&gt;, which you absolutely should read in its entirety.  Nevertheless, I will quote:&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;We knew that everyone else was writing their software in C++ or Perl. But we also knew that that didn't mean anything. If you chose technology that way, you'd be running Windows. When you choose technology, you have to ignore what other people are doing, and consider only what will work the best.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(...)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;When I was about nine I happened to get hold of a copy of "The Day of the Jackal", by Frederick Forsyth. The main character is an assassin who is hired to kill the president of France. The assassin has to get past the police to get up to an apartment that overlooks the president's route. He walks right by them, dressed up as an old man on crutches, and they never suspect him.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Our secret weapon was similar. We wrote our software in a weird AI language, with a bizarre syntax full of parentheses. For years it had annoyed me to hear Lisp described that way. But now it worked to our advantage. In business, there is nothing more valuable than a technical advantage your competitors don't understand. In business, as in war, surprise is worth as much as force.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Graham's weapon, the Lisp language, was not and still is not normally used in businesses. It is mostly used by academics. Nubank using Clojure (a lisp language) is a notable exception. (And Nubank's app is made with Flutter – they must be following Graham's advice.) But the main point is, don't do what everyone else is doing – do something better, which I think Flutter is, except for the Google risk.&lt;/p&gt;
&lt;p&gt;Perusing discussions about the future of Flutter, I came across &lt;a href="https://www.reddit.com/r/FlutterDev/comments/14pr5mu/comment/jqljlgq/"&gt;this comment&lt;/a&gt; from July 2023 that made a lot of sense to me:&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Connecting the dots of what Google has been doing over the past 13+ years:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Launched a system programming language called GO&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Forked little kernel to make Zircon&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Started the Fuchsia project on top of Zircon built with Go.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Launched Flutter for cross platform&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Community engagement for spreading the usage of Flutter&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Build all tool kits for complete cross platform support&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Build a large swarm of one million apps running in Flutter on play store by community&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;So I believe Google is trying to hit the IOT market as the existing operating systems are very heavy to be interfaced with smaller devices in which Zircon based hardware is a lighter option with a lot of perks. To make that hardware accessible to masses we need an operating system which is the Fuchsia. But if an operating system is introduced to the world no one is going to use it as for the adoption we require APPS. To make those apps they selected Flutter and Dart as their native language to write apps for Fuschia. Now, they've started community engagement to make flutter a widespread tool and used community to make a unified codebase for a million apps which can be made available in both the play store and the upcoming Fuschia store. This will solve the problem of NO apps in the market for newly launching OS. (The Windows Phone team thought people would make apps instead of community engagement through the years that's why they failed miserably.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Now when the new OS is launched it'll have a lot of apps which can simply be ported to support Fuchsia with minimal efforts and opens a whole new world of Zircon based hardware hitting the market interfacing with the new OS ushering a new era of IOT apps through Fuchsia.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;So Flutter is just a part of a BIG PLAN for years and not a thing made to Die by Google.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;That's all I have for you. I think Flutter is the way forward for me, but unfortunately I don't have a crystal ball to divine the future.&lt;/p&gt;</description><category>computing</category><category>flutter</category><category>programming</category><guid>https://read.nando.audio/posts/adopting-flutter.html</guid><pubDate>Thu, 23 May 2024 09:51:00 GMT</pubDate></item><item><title>The crumminess of web tech</title><link>https://read.nando.audio/posts/crummy-web-tech.html</link><dc:creator>Nando Florestan</dc:creator><description>&lt;p&gt;We make things for the web because the web is free. We want our stuff to be accessible to everyone. We don't want, for instance, the Apple police dictating whether we can update our app or not, or when, or how, or taking an enormous cut of our income.&lt;/p&gt;
&lt;p&gt;But the default web tech has always been very bad for making web applications. It was originally invented for hypertext, not apps. It has been a long "evolution", but until yesterday, it didn't even offer native popovers, so everyone had to create their own. It is safe to say that a popover component should be part of every basic app toolkit.&lt;/p&gt;
&lt;p&gt;Here are a few ways in which web tech is bad:&lt;/p&gt;
&lt;h3&gt;1. JavaScript&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;JavaScript&lt;/strong&gt; is a language that makes kittens cry every day.
It was created in a week and now we have to tolerate it forever!?
&lt;a href="https://www.destroyallsoftware.com/talks/wat"&gt;WAT&lt;/a&gt;.
The best book about it is called "JavaScript - the good parts"...
It is the only language I know with so many evil parts, other than &lt;a href="https://en.wikipedia.org/wiki/INTERCAL"&gt;INTERCAL&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;2. Standards schmandards&lt;/h3&gt;
&lt;p&gt;Web browsers implement standards differently, and devs suffer with browser support.
This will never improve: the new Popover API, which everyone wants to use, already has been implemented differently in each browser.
In 2024! My God, the story never changes!!!&lt;/p&gt;
&lt;p&gt;Therefore your &lt;strong&gt;layout breaks&lt;/strong&gt; through no fault of your own. It may work today and break tomorrow – not in theory, but in practice.&lt;/p&gt;
&lt;p&gt;Further, when your web app runs out there in weird browsers on weird phones, or just in Safari (which is always lagging like an Internet Explorer in adoption of web standards), you keep seeing very &lt;strong&gt;weird error messages&lt;/strong&gt; in your Sentry.
Hard to believe they are real.&lt;/p&gt;
&lt;h3&gt;3. CSS&lt;/h3&gt;
&lt;p&gt;CSS is always in flux. At first, one had to learn how to write semantic CSS.
Then CSS frameworks appeared, solving new problems and creating new ones.
Now everyone uses Tailwind, which is again better, but again poses the old problem of how to use CSS well.
In fact, Tailwind requires the development of very good taste about "where to put this code", because there are 4 different layers of abstraction, all of them valuable:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;global CSS (such as theme variables),&lt;/li&gt;
&lt;li&gt;components (where Tailwind defers to Bootstrap style),&lt;/li&gt;
&lt;li&gt;usage of actual Tailwind classes (with the danger of too much repetition), and&lt;/li&gt;
&lt;li&gt;inline styles, which should be very rare, but still do happen.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;4. Build pipeline hell&lt;/h3&gt;
&lt;p&gt;Typescript and &lt;a href="https://flow.org/"&gt;Flow&lt;/a&gt; are better than JS, but using them requires compilation.
Tailwind does, too.
&lt;strong&gt;Build tools&lt;/strong&gt; such as vite are hard to understand and configure, but occasionally that responsibility falls on you.
At that moment, you wish you had chosen straight JS, no build pipeline.&lt;/p&gt;
&lt;p&gt;For instance, &lt;a href="https://dev.to/tylerlwsmith/build-a-vite-5-backend-integration-with-flask-jch"&gt;this article&lt;/a&gt; teaches you how to have hot reload if you use Vite in the frontend and Flask in the backend.
It doesn't mention that you can do the opposite: Vite has a reverse proxy.
Maybe the article was written before Vite added the reverse proxy.
Anyway, the section named "A word of caution" states:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;In my 7 years of building for the web, I've used Grunt, Gulp, Webpack, esbuild, and Parcel.
Snowpack and Rome came-and-went before I ever had a chance to try them.
Bun is vying for the spot of The New Hotness in bundling, Rome has been forked into Biome, and Vercel is building a Rust-based Webpack alternative.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;5. Overactive ecosystem&lt;/h3&gt;
&lt;p&gt;The above paragraph is just one instance of a tremendous problem:&lt;/p&gt;
&lt;p&gt;The JavaScript ecosystem is overactive, oriented to excitement, with lots of packages being created all the time, and then dying in less than 5 years.
In fact, you will have a library die before you have a chance to use it.
Happened to him, happened to me.
A normal developer needs something durable, stable.
But we are unable to tell which tools are going to be responsible and stay maintained.
And the considerable force of the &lt;em title="fear of missing out"&gt;FOMO&lt;/em&gt; makes us try many alternatives.&lt;/p&gt;
&lt;h3&gt;6. Unruly npm dependencies&lt;/h3&gt;
&lt;p&gt;Controlling the dependencies of your project can be pretty impossible.
Every medium project out there depends on an unreasonable number of &lt;strong&gt;npm packages&lt;/strong&gt;, and you as app developer have a very faint idea of what most of them do.
This is dangerous. But it is also a consequence of the overactive ecosystem.&lt;/p&gt;
&lt;h3&gt;7. Legacy code&lt;/h3&gt;
&lt;p&gt;Because &lt;strong&gt;libraries and frameworks are so short-lived&lt;/strong&gt;, they put a ceiling on how much devs can accomplish before they have to reimplement their own "legacy code".
Witness Angular 2.0, which infamously gave devs no upgrade path from AngularJS 1, leaving thousands of projects orphaned.&lt;/p&gt;
&lt;h3&gt;8. Boiled frogs&lt;/h3&gt;
&lt;p&gt;Because the web is necessary, programmers learn JavaScript first and specialize in it too early.
These inexperienced developers easily become &lt;strong&gt;the proverbial boiled frog&lt;/strong&gt; – they have no idea of what a sane environment actually feels like, let alone a good programming language.
They think that world is normal.&lt;/p&gt;
&lt;p&gt;Boiled frogs will disagree with what I am saying.
Perhaps even jump to the cheap accusation of a "skill issue".&lt;/p&gt;
&lt;p&gt;A subset of the boiled frogs shrug and declare "I did my job".
They are happy to learn something new, jump ship, and leave the hand that fed them with legacy code that is only 4 years old.
That is an irresponsible and immoral thing to do.
Those people have no right to complain about planned obsolescence, or they would be hypocrites.&lt;/p&gt;
&lt;p&gt;On the other hand, developers who have a clue may dismay in the face of adversity, sometimes optimizing for ease of implementation rather than awesomeness of UI design.
Today many a developer says they prefer the backend to the frontend.&lt;/p&gt;
&lt;p&gt;If HTML, CSS and JS weren't so awful, then we wouldn't be seeing every other language compile to JS or WebAssembly or both.
&lt;strong&gt;The impetus of WebAssembly is proof&lt;/strong&gt; that many, many people agree with what I am saying here.&lt;/p&gt;
&lt;h3&gt;9. Too much learning&lt;/h3&gt;
&lt;p&gt;And now the worst part: &lt;strong&gt;the amount of learning&lt;/strong&gt; that a programmer has to constantly go through.
This is something that the boiled frogs don't see anymore, but they have been wasting their lives and brains on HTML, CSS and JS, not to mention JS frameworks in general, especially React, Vue etc. which are always imposing new concepts and new ways.&lt;/p&gt;
&lt;p&gt;FOMO makes you try new frameworks.
For instance, SolidJS suddenly offers much higher performance through a smarter observable.
But only when you use it, do you realize limitations such as...
SolidJS only likes arrays, you can't use Maps or Sets, which by the way are collections in JS that should be much more popular.&lt;/p&gt;
&lt;p&gt;99% of JS frameworks are full of leaky abstractions like that.
They seem to solve a problem but create many others by hurting all the other dreams you had for your code.&lt;/p&gt;
&lt;h3 id="history"&gt;Tiny history of the crumminess&lt;/h3&gt;

&lt;p&gt;In 1995, Netscape told Brendan Eich to quickly create a little language they wanted to add to their browser. So &lt;a href="https://thenewstack.io/brendan-eich-on-creating-javascript-in-10-days-and-what-hed-do-differently-today/"&gt;JavaScript was created in 10 days&lt;/a&gt;. Nobody expected it to become the most used language...&lt;/p&gt;
&lt;p&gt;Through the decades, &lt;a href="https://keyua.org/blog/top-alternatives-to-javascript-for-web-development/"&gt;many, many alternatives&lt;/a&gt; were created, so developers wouldn't have to suffer the crummy JavaScript. One of the most important ones was CoffeeScript (2009). Microsoft hired the designer of Delphi to create their own in 2012: TypeScript, or "C# in the browser". TypeScript basically has won. However, all these languages introduce a compilation step, because only JavaScript ran in the browser. Now developers have to wait before seeing changes on the page, which is crummy.&lt;/p&gt;
&lt;p&gt;The formatting language, CSS, was considered crummy, so they did the same thing: they invented CSS improvements which needed a compilation step down to CSS, making the total compilation time even longer and crummier.&lt;/p&gt;
&lt;p&gt;With compilation, debugging suddenly became crummy, because when an error occurred, the browser reported the error was in line 934 of a JavaScript program that you hadn't written and looked hideous. So Chrome invented source maps, solving that problem: Now the browser would map lines of code and report the error on your CoffeScript source, not the translated JavaScript source. But source maps are a heavy download and they take even more time to compile, making them crummy. For being heavy, they are never used in production.&lt;/p&gt;
&lt;p&gt;Trying to control the problem of web apps being heavier and heavier downloads in production, they added "tree shaking", which means, the compiler is smart enough to omit functions that were written but aren't actually currently used in the app. Feeling smart, they forget this is one more complicated thing that every web developer needs to know exists, and takes more compilation time, being, therefore, crummy.&lt;/p&gt;
&lt;p&gt;To give back to developers the immediacy of saving code and seeing the changes in the browser without having to wait, sophisticated build tools such as gulp, webpack, vite etc. make complex decisions about which of those things to do during development and which to do in a production build. That's not all they do, it's more complex. Anyway, they have become yet another essential tool in the toolkit, they last even shorter than web frameworks, they are hard to understand, they have hundreds of configuration options... but they solve the immediacy problem – yet again, in a crummy way.&lt;/p&gt;
&lt;p&gt;And in this manner, web development is ever more complex, and the crazy mob continues to think themselves smart after patching fundamental wounds with more and more tools.&lt;/p&gt;
&lt;p&gt;The real solution always was something like Dart (2011) or WebAssembly (2017): a hard break with crummy web tech, as long as the replacement tech were as open as the web, and designed for applications from the start. So what did the boiled frogs do? They basically ignored these. The initial plan for Dart was to include it in Chrome as the good brother of JavaScript. This was criticized for fragmenting the web, so &lt;a href="https://news.dartlang.org/2015/03/dart-for-entire-web.html"&gt;they gave up this idea in 2015&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Instead, Node.js (2009) brought JavaScript to the server, and now boiled frogs write their backend and frontend in the same language: the worst one.  Someone help them!&lt;/p&gt;
&lt;h3&gt;Searching for a solution&lt;/h3&gt;
&lt;p&gt;You thought you would develop your product, be done, sit back, let the profits come in and never work again. Then you learned Chacon's lesson: &lt;strong&gt;software is a tamagotchi.&lt;/strong&gt; Like a virtual pet, software has its own needs that must be tended to, over time, constantly. That's normal in software. What is abnormal is the furious intensity of the tamagotchiness if you use web tech: if you don't update it, in only 4 years it is legacy code that nobody wants to maintain.&lt;/p&gt;
&lt;p&gt;In short, you had a problem, so you decided to write a web app. Now you have 9 problems, with more to be expected in the future.&lt;/p&gt;
&lt;p&gt;We want to make web apps, yes. But with decent tools!&lt;/p&gt;
&lt;p&gt;Through the years I have tried many alternatives to JS, especially those that promised I could write my web apps in Python, the most legible language. But I never felt they were mature enough to actually use. They always came with serious drawbacks, such as more difficulty debugging, due to translation to JS.&lt;/p&gt;
&lt;h3&gt;Still within web tech: Mithril&lt;/h3&gt;
&lt;p&gt;The best I could do was use basic JavaScript as much as possible, avoiding frameworks that interfere in my data.
Something like &lt;a href="https://mithril.js.org/"&gt;Mithril.js&lt;/a&gt;, a reactive library with limited scope, is the best you can choose.
When I use Mithril, my state management library is {}.
Do not let a framework dictate how your data should be organized!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You must isolate your business logic from JS frameworks.&lt;/strong&gt; Write the core of your system with one principle: importing the JS framework is not allowed!
Keep the code that uses the framework very thin.
This is the only way some of your code can survive these frameworks, which usually last only 4 years.&lt;/p&gt;
&lt;p&gt;Avoiding the situation in which your entire frontend is suddenly a pile of legacy code is so important that it trumps other considerations, such as the availability of ready-made widgets for your framework.
There are only &lt;a href="https://vrimar.github.io/construct-ui/"&gt;one&lt;/a&gt; or &lt;a href="https://github.com/ArthurClemens/polythene"&gt;two&lt;/a&gt; widget &lt;a href="https://github.com/orbitbot/awesome-mithril?tab=readme-ov-file#libraries-components--plugins"&gt;libraries for Mithril&lt;/a&gt; out there.
To avoid reinventing the wheel we switch to web components (custom elements) for very complex things such as editable sortable filterable data grids.&lt;/p&gt;
&lt;h3&gt;Beyond web tech: Flutter&lt;/h3&gt;
&lt;p&gt;The crumminess of web tech is a good reason to adopt something like &lt;a href="https://en.wikipedia.org/wiki/Flutter_(software)"&gt;Flutter&lt;/a&gt;.
Since 2021, it can render on the web using Canvas.
Like a game engine, it paints the screen before it hands the pixels over to some dumb surface or canvas of the platform it is currently sitting on.
Therefore, &lt;strong&gt;my layout will never break&lt;/strong&gt;.
I will no longer care whether browsers agree on most things.
I won't have to use HTML or CSS or web frameworks.
The Dart language has been getting great features, such as null safety (2021).
Much better than JS and very similar to TypeScript, so learning Dart is easy for most.
My Sentry will certainly contain fewer weird errors from weird browsers.
And no need to ever configure a bundler.&lt;/p&gt;
&lt;p&gt;CSS? Hahahahahaah... CSS... Good one!&lt;/p&gt;
&lt;p&gt;Flutter is an open source cross-platform application development kit created by Google.
From one codebase it generates the same application for Android, iOS, web, Windows, OS X and Linux.
One million applications have been created with it.&lt;/p&gt;
&lt;p&gt;Flutter has an initial learning curve, for sure.
But in the long run, that is much less effort than keeping up with crummy web tech!&lt;/p&gt;
&lt;p&gt;What about beginning developers?
What do you think is easier, to learn HTML, then CSS, then Javascript, then Typescript, then Vue, then vite (and alternatives)... or to learn Dart and then Flutter?&lt;/p&gt;
&lt;p&gt;But one must know when to use this kind of thing on the web.
Flutter is for applications, not for content websites.
A Flutter app running on the web is a heavier and slower download, does not expose its content to search engines, and does not easily integrate with the accessibility features of the web platform.
Keep your blog in HTML, because HTML was created for hypertext.
But it wasn't created for web apps!
We have been forcing web apps onto it for years, defacing it, turning it into a monster.&lt;/p&gt;
&lt;p&gt;And the only problem is, Flutter's performance is great on every platform, except the web, and Google is not doing anything about that – not in 2024, at least.
The web seems to be a second-class platform for them.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Although I am only getting started with Flutter, it is already easy to see how developer productivity should be higher by using it instead of HTML, CSS and TypeScript.&lt;/p&gt;
&lt;p&gt;My interest is not necessarily to make iOS or Android apps, no. Just make my life easier.
Make a bloody app that will even run on the bloody web, without requiring that I use crummy web tech.&lt;/p&gt;
&lt;h3&gt;Further thoughts by other people&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=5ChkQKUzDCs"&gt;Big projects are ditching TypeScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=e3xl5kLiyJM"&gt;Christin Gorman: Being a full stack dev is impossible&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=xh-iMBOXl6M"&gt;Radical simplicity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=aWfYxg-Ypm4"&gt;Interview with Senior JS Developer 2024&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><category>computing</category><category>css</category><category>flutter</category><category>html</category><category>javascript</category><category>programming</category><guid>https://read.nando.audio/posts/crummy-web-tech.html</guid><pubDate>Mon, 20 May 2024 10:59:03 GMT</pubDate></item></channel></rss>