<?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 (Artikoloj pri programming)</title><link>https://read.nando.audio/</link><description></description><atom:link href="https://read.nando.audio/eo/categories/programming.xml" rel="self" type="application/rss+xml"></atom:link><language>eo</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/eo/posts/revising-the-output-of-a-coding-assistant.html</link><dc:creator>Nando Florestan</dc:creator><description>&lt;p&gt;Ĉi tiu blogaĵo ankoraŭ ne disponeblas en Esperanto.&lt;/p&gt;</description><category>computing</category><category>programming</category><guid>https://read.nando.audio/eo/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/eo/posts/new-employee.html</link><dc:creator>Nando Florestan</dc:creator><description>&lt;p&gt;Ĉi tiu blogaĵo ankoraŭ ne estas tradukita en Esperanto.&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/eo/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/eo/posts/harmful-tools.html</link><dc:creator>Nando Florestan</dc:creator><description>&lt;p&gt;Ĉi tiu blogaĵo ankoraŭ ne disponeblas en Esperanto.&lt;/p&gt;</description><category>agile</category><category>computing</category><category>programming</category><guid>https://read.nando.audio/eo/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/eo/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/eo/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/eo/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/eo/posts/no-estimates.html"&gt;No estimates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://read.nando.audio/eo/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><guid>https://read.nando.audio/eo/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/eo/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/eo/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/eo/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/eo/posts/no-estimates.html"&gt;No estimates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://read.nando.audio/eo/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><guid>https://read.nando.audio/eo/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/eo/posts/waterfall.html</link><dc:creator>Nando Florestan</dc:creator><description>&lt;p&gt;Ĉi tiu blogaĵo ankoraŭ ne estas disponebla en Esperanto.&lt;/p&gt;</description><category>agile</category><category>computing</category><category>programming</category><guid>https://read.nando.audio/eo/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/eo/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><guid>https://read.nando.audio/eo/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/eo/posts/agile.html</link><dc:creator>Nando Florestan</dc:creator><description>&lt;p&gt;Ĉi tiu blogaĵo ankoraŭ ne estas disponebla en Esperanto.&lt;/p&gt;</description><category>agile</category><category>computing</category><category>programming</category><guid>https://read.nando.audio/eo/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/eo/posts/adopting-flutter.html</link><dc:creator>Nando Florestan</dc:creator><description>&lt;p&gt;Ĉi tiu blogaĵo ankoraŭ ne estas disponebla en Esperanto.&lt;/p&gt;</description><category>computing</category><category>flutter</category><category>programming</category><guid>https://read.nando.audio/eo/posts/adopting-flutter.html</guid><pubDate>Thu, 23 May 2024 09:51:00 GMT</pubDate></item><item><title>La krudeco de retaj teknologioj</title><link>https://read.nando.audio/eo/posts/crummy-web-tech.html</link><dc:creator>Nando Florestan</dc:creator><description>&lt;p&gt;Ni kreas aferojn por la reto ĉar la reto estas libera. Ni volas, ke niaj aferoj estu alireblaj al ĉiuj. Ni ne volas, ekzemple, ke la polico de Apple diktu ĉu ni povas ĝisdatigi nian aplikaĵon aŭ ne, aŭ kiam, aŭ kiel, aŭ preni grandegan parton de niaj enspezoj.&lt;/p&gt;
&lt;p&gt;Sed la defaŭltaj retaj teknologioj ĉiam estis tre malbonaj por krei retajn aplikaĵojn. Ili estis origine inventitaj por hiperteksto, ne por aplikaĵoj. Ili longe "evoluis", sed ĝis hieraŭ, ĝi eĉ ne ofertis indiĝenajn popoverojn, do ĉiu devis krei siajn proprajn. Estas sekure diri, ke popover-komponento devus esti parto de ĉiu baza aplikaĵ-iloaro.&lt;/p&gt;
&lt;p&gt;Jen kelkaj manieroj en kiuj retaj teknologioj estas malbonaj:&lt;/p&gt;
&lt;h3&gt;1. JavaScript&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;JavaScript&lt;/strong&gt; estas lingvo kiu igas katidojn plori  ĉiutage. Ĝi estis kreita en semajno kaj nun ni devas toleri ĝin eterne!? &lt;a href="https://www.destroyallsoftware.com/talks/wat"&gt;WAT&lt;/a&gt;. La plej bona libro pri ĝi estas titolita "JavaScript - la bonaj partoj"... Ĝi estas la sola lingvo kiun mi konas kun tiom multaj malbonaj partoj, krom &lt;a href="https://en.wikipedia.org/wiki/INTERCAL"&gt;INTERCAL&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;2. Normoj ŝmnormoj&lt;/h3&gt;
&lt;p&gt;Retumiloj implementas normojn malsame, kaj programistoj suferas pro retumilsubteno. Ĉi tio neniam pliboniĝos: la nova Popover API, kiun ĉiuj volas uzi, jam estas malsame implementita en ĉiu retumilo. En 2024! Mia Dio, la historio neniam ŝanĝiĝas!!!&lt;/p&gt;
&lt;p&gt;Tial via &lt;strong&gt;aranĝo rompiĝas&lt;/strong&gt; sen via kulpo. Ĝi povas funkcii hodiaŭ kaj rompi morgaŭ – ne en teorio, sed en praktiko.&lt;/p&gt;
&lt;p&gt;Plue, kiam via reta aplikaĵo funkcias en strangaj retumiloj en strangaj telefonoj, aŭ nur en Safari (kiu ĉiam malfruas kiel Internet Explorer en adopto de retaj normoj), vi daŭre vidas tre &lt;strong&gt;strangajn erarmesaĝojn&lt;/strong&gt; en via Sentry. Malfacilas kredi ke ili estas realaj.&lt;/p&gt;
&lt;h3&gt;3. CSS&lt;/h3&gt;
&lt;p&gt;CSS ĉiam estas en fluo. Komence, oni devis lerni kiel skribi semantikan CSS. Poste CSS-kadroj aperis, solvante novajn problemojn kaj kreante novajn. Nun ĉiuj uzas Tailwind, kiu denove estas pli bona, sed denove prezentas la malnovan problemon de kiel bone uzi CSS. Fakte, Tailwind postulas la disvolvon de tre bona gusto pri "kie meti ĉi tiun kodon", ĉar ekzistas 4 malsamaj tavoloj de abstrakto, ĉiuj valoraj:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;tutmonda CSS (kiel temaj variabloj),&lt;/li&gt;
&lt;li&gt;komponentoj (kie Tailwind cedas al Bootstrap-stilo),&lt;/li&gt;
&lt;li&gt;uzo de realaj Tailwind-klasoj (kun la danĝero de troa ripetado), kaj&lt;/li&gt;
&lt;li&gt;enliniaj stiloj, kiuj devus esti tre raraj, sed tamen okazas.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;4. Konstrua piplino infero&lt;/h3&gt;
&lt;p&gt;Typescript kaj &lt;a href="https://flow.org/"&gt;Flow&lt;/a&gt; estas pli bonaj ol JS, sed ilia uzo postulas kompiladon. Tailwind ankaŭ. &lt;strong&gt;Konstruiloj&lt;/strong&gt; kiel vite estas malfacilaj kompreni kaj agordi, sed foje tiu respondeco falas sur vin. En tiu momento, vi pensos ke vi devintus elekti rektan JS, sen konstrua piplino.&lt;/p&gt;
&lt;p&gt;Ekzemple, &lt;a href="https://dev.to/tylerlwsmith/build-a-vite-5-backend-integration-with-flask-jch"&gt;ĉi tiu artikolo&lt;/a&gt; instruas vin kiel havi varman reŝargon se vi uzas Vite en la antaŭa finaĵo kaj Flask en la malantaŭa finaĵo. Ĝi ne mencias, ke vi povas fari la kontraŭon: Vite havas inversan prokurilon. Eble la artikolo estis skribita antaŭ ol Vite aldonis la inversan prokurilon. Tamen, la sekcio nomita "Vorto de atentigo" diras:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;En miaj 7 jaroj de konstruado por la reto, mi uzis Grunt, Gulp, Webpack, esbuild, kaj Parcel. Snowpack kaj Rome venis kaj iris antaŭ ol mi iam havis ŝancon provi ilin. Bun konkuras por la loko de La Nova Varmaĵo en pakaĵo, Rome estis forkita en Biome, kaj Vercel konstruas Rust-bazitan Webpack-alternativon.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;5. Troaktiva ekosistemo&lt;/h3&gt;
&lt;p&gt;La supra paragrafo estas nur unu ekzemplo de enorma problemo:&lt;/p&gt;
&lt;p&gt;La JavaScript-ekosistemo estas troaktiva, orientita al ekscito, kun multaj pakaĵoj kreiĝantaj la tutan tempon, kaj poste mortantaj en malpli ol 5 jaroj. Fakte, vi havos bibliotekon morti antaŭ ol vi havos ŝancon uzi ĝin. Okazis al li, okazis al mi. Normala programisto bezonas ion daŭran, stabilan. Sed ni ne kapablas diri kiuj iloj estos respondecaj kaj resti prizorgataj. Kaj la konsiderinda forto de la &lt;em title="timo maltrafi"&gt;FOMO&lt;/em&gt; igas nin provi multajn alternativojn.&lt;/p&gt;
&lt;h3&gt;6. Malordonaj npm-dependecoj&lt;/h3&gt;
&lt;p&gt;Kontroli la dependecojn de via projekto povas esti tre malebla. Ĉiu meza projekto dependas de neracia nombro da &lt;strong&gt;npm-pakaĵoj&lt;/strong&gt;, kaj vi kiel aplikaĵprogramisto havas tre malfortan ideon pri kio plej multaj el ili faras. Ĉi tio estas danĝera. Sed ĝi ankaŭ estas sekvo de la troaktiva ekosistemo.&lt;/p&gt;
&lt;h3&gt;7. Heredata kodo&lt;/h3&gt;
&lt;p&gt;Ĉar &lt;strong&gt;bibliotekoj kaj kadroj estas tiel mallongdaŭraj&lt;/strong&gt;, ili metas plafonon sur kiom multe programistoj povas atingi antaŭ ol ili devas reimplementi sian propran "heredatan kodon". Atestu Angular 2.0, kiu fifame ne donis ĝisdatigan vojon de AngularJS 1, lasante milojn da projektoj orfaj.&lt;/p&gt;
&lt;h3&gt;8. Boligitaj ranoj&lt;/h3&gt;
&lt;p&gt;Ĉar la reto estas necesa, programistoj lernas JavaScript unue kaj specialiĝas en ĝi tro frue. Tiuj nespertaj programistoj facile fariĝas &lt;strong&gt;la proverba boligita rano&lt;/strong&gt; – ili ne havas ideon pri kiel sana medio fakte sentas, des malpli bona programlingvo. Ili pensas, ke tiu mondo estas normala.&lt;/p&gt;
&lt;p&gt;Boligitaj ranoj malkonsentos kun tio, kion mi diras. Eble eĉ saltos al la malmultekosta akuzo de "kapabloproblemo".&lt;/p&gt;
&lt;p&gt;Subgrupo de la boligitaj ranoj levas ŝultrojn kaj deklaras "Mi faris mian laboron". Ili ĝojas lerni ion novan, ŝanĝi ŝipon, kaj lasi la manon kiu nutris ilin kun heredita kodo kiu estas nur 4 jarojn aĝa. Tio estas ne respondeca kaj nemorala ago. Tiuj homoj ne rajtas plendi pri planita malnoviĝo, aŭ ili estus hipokritoj.&lt;/p&gt;
&lt;p&gt;Aliflanke, programistoj kiuj havas ideon povas malesperi antaŭ malfacilaĵoj, foje optimumigante por facileco de efektivigo prefere ol boneco de UI-dezajno. Hodiaŭ multaj programistoj diras, ke ili preferas la malantaŭan finaĵon ol la antaŭan finaĵon.&lt;/p&gt;
&lt;p&gt;Se HTML, CSS kaj JS ne estus tiel teruraj, tiam ni ne vidus ĉiun alian lingvon kompili al JS aŭ WebAssembly aŭ ambaŭ. &lt;strong&gt;La impeto de WebAssembly estas pruvo&lt;/strong&gt; ke multaj, multaj homoj konsentas kun tio, kion mi diras ĉi tie.&lt;/p&gt;
&lt;h3&gt;9. Tro da lernado&lt;/h3&gt;
&lt;p&gt;Kaj nun la plej malbona parto: &lt;strong&gt;la kvanto de lernado&lt;/strong&gt; kiun programisto devas konstante trapasi. Ĉi tio estas io, kion la boligitaj ranoj ne plu vidas, sed ili estis malŝparantaj siajn vivojn kaj cerbojn pri HTML, CSS kaj JS, por ne mencii JS-kadrojn ĝenerale, precipe React, Vue ktp. kiuj ĉiam trudas novajn konceptojn kaj novajn manierojn.&lt;/p&gt;
&lt;p&gt;FOMO igas vin provi novajn kadrojn. Ekzemple, SolidJS subite ofertas multe pli altan rendimenton tra pli inteligenta observebla. Sed nur kiam vi uzas ĝin, vi rimarkas limigojn kiel... SolidJS nur ŝatas tabelojn, vi ne povas uzi Mapojn aŭ Arojn, kiuj cetere estas kolektoj en JS kiuj devus esti multe pli popularaj.&lt;/p&gt;
&lt;p&gt;99% de JS-kadroj estas plenaj de truaj abstraktaĵoj kiel tio. Ili ŝajnas solvi problemon sed kreas multajn aliajn per damaĝo al ĉiuj aliaj revoj, kiujn vi havis por via kodo.&lt;/p&gt;
&lt;h3 id="historio"&gt;Eta historio de la krudeco&lt;/h3&gt;

&lt;p&gt;En 1995, Netscape mendis al Brendan Eich rapide krei etan lingvon, kiun ili volis aldoni al sia retumilo. Do &lt;a href="https://thenewstack.io/brendan-eich-on-creating-javascript-in-10-days-and-what-hed-do-differently-today/"&gt;JavaScript estis kreita en 10 tagoj&lt;/a&gt;. Neniu atendis, ke ĝi fariĝos la plej uzata lingvo...&lt;/p&gt;
&lt;p&gt;Tra la jardekoj, &lt;a href="https://keyua.org/blog/top-alternatives-to-javascript-for-web-development/"&gt;multaj, multaj alternativoj&lt;/a&gt; estis kreitaj, por ke programistoj ne devu suferi la krudan JavaScript. Unu el la plej gravaj estis CoffeeScript (2009). Microsoft dungis la projektiston de Delphi por krei sian propran en 2012: TypeScript, aŭ "C# en la retumilo". TypeScript baze venkis. Tamen, ĉiuj ĉi tiuj lingvoj enkondukas kompiladon, ĉar nur JavaScript ruliĝis en la retumilo. Nun programistoj devas atendi antaŭ ol vidi ŝanĝojn sur la paĝo, kio estas kruda.&lt;/p&gt;
&lt;p&gt;La formatiga lingvo, CSS, estis konsiderata kruda, do ili faris la saman aferon: ili inventis CSS-plibonigojn, kiuj bezonis kompiladon al CSS, igante la tutan kompiladon eĉ pli longa kaj pli kruda.&lt;/p&gt;
&lt;p&gt;Kun kompilado, sencimigo (senararigado) subite fariĝis kruda, ĉar kiam eraro okazis, la retumilo raportis ke la eraro estis en linio 934 de JavaScript-programo, kiun vi ne skribis kaj aspektis terure. Do Chrome inventis fontmapojn, solvante tiun problemon: Nun la retumilo mapus liniojn de kodo kaj raportus la eraron sur via CoffeeScript-fonto, ne la tradukita JavaScript-fonto. Sed fontmapoj estas peza elŝuto kaj ili prenas eĉ pli da tempo por kompili, igante ilin krudaj. Pro ilia pezo, ili neniam estas uzataj en produktado.&lt;/p&gt;
&lt;p&gt;Provante kontroli la problemon de retaj aplikaĵoj esti pli kaj pli pezaj elŝutoj en produktado, ili aldonis "arboŝanĝadon", kio signifas, ke la kompililo estas sufiĉe inteligenta por preterlasi funkciojn, kiuj estis skribitaj, sed ne estas fakte nuntempe uzataj en la aplikaĵo. Sentante sin inteligentaj, ili forgesas, ke ĉi tio estas unu pli komplika afero, kiun ĉiu retprogramisto devas scii ekzistas, kaj prenas pli da kompilado, do kruda.&lt;/p&gt;
&lt;p&gt;Por redoni al programistoj la senprokrastecon de ŝparado de kodo kaj vidado de la ŝanĝoj en la retumilo sen devi atendi, sofistikaj konstruiloj kiel gulp, webpack, vite ktp. faras kompleksajn decidojn pri kiuj el tiuj aferoj fari dum evoluo kaj kiuj fari en produktada konstruaĵo. Tio ne estas ĉio, kion ili faras, estas pli komplekse. Tamen, ili fariĝis alia esenca ilo en la iloaro, ili daŭras eĉ pli mallonge ol retaj kadroj, ili estas malfacilaj kompreni, ili havas centojn da agordeblaj opcioj... sed ili solvas la senprokrastecan problemon – denove, en kruda maniero.&lt;/p&gt;
&lt;p&gt;Kaj tiel, retprogramado fariĝas ĉiam pli kompleksa, kaj la freneza homamaso daŭre pensas sin inteligentaj post plendo de fundamentaj vundoj kun pli kaj pli da iloj.&lt;/p&gt;
&lt;p&gt;La vera solvo ĉiam estis io kiel Dart (2011) aŭ WebAssembly (2017): malmola rompo kun krudaj retaj teknologioj, kondiĉe ke la anstataŭa teknologio estu same malferma kiel la reto, kaj desegnita por aplikaĵoj dekomence. Do kion faris la boligitaj ranoj? Ili baze ignoris ĉi tiujn. La komenca plano por Dart estis inkluzivi ĝin en Chrome kiel la bona frato de JavaScript. Ĉi tio estis kritikata pro fragmentado de la reto, do &lt;a href="https://news.dartlang.org/2015/03/dart-for-entire-web.html"&gt;ili rezignis pri ĉi tiu ideo en 2015&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Anstataŭe, Node.js (2009) alportis JavaScript al la servilo, kaj nun boligitaj ranoj skribas sian malantaŭan kaj antaŭan finaĵon en la sama lingvo: la plej malbona. Iu helpu ilin!&lt;/p&gt;
&lt;h3&gt;Serĉante solvon&lt;/h3&gt;
&lt;p&gt;Vi pensis, ke vi disvolvos vian produkton, finos, sidiĝos, lasos la profitojn veni kaj neniam plu laboros. Poste vi lernis la lecionon de Chacon: &lt;strong&gt;programo estas tamagotchi.&lt;/strong&gt; Kiel virtuala dorlotbesto, programo havas siajn proprajn bezonojn, kiuj devas esti prizorgataj, laŭ la tempo, konstante. Tio estas normala en programado. Kio estas nenormala estas la furioza intenseco de la tamagoŝieco se vi uzas retajn teknologiojn: se vi ne ĝisdatigas ĝin, en nur 4 jaroj ĝi estas heredata kodo, kiun neniu volas prizorgi.&lt;/p&gt;
&lt;p&gt;Mallonge, vi havis problemon, do vi decidis skribi retan aplikaĵon. Nun vi havas 9 problemojn, kun pli atendi en la estonteco.&lt;/p&gt;
&lt;p&gt;Ni volas fari retajn aplikaĵojn, jes. Sed kun decaj iloj!&lt;/p&gt;
&lt;p&gt;Tra la jaroj mi provis multajn alternativojn al JS, precipe tiujn kiuj promesis, ke mi povus skribi miajn retajn aplikaĵojn en Python, la plej legebla lingvo. Sed mi neniam sentis, ke ili estis sufiĉe maturaj por fakte uzi. Ili ĉiam venis kun seriozaj malavantaĝoj, kiel pli da malfacileco senararigi, pro traduko al JS.&lt;/p&gt;
&lt;h3&gt;Ankoraŭ ene de retaj teknologioj: Mithril&lt;/h3&gt;
&lt;p&gt;La plej bona afero, kion mi povis fari, estis uzi bazan JavaScript kiom eble, evitante kadrojn, kiuj enmiksiĝas en miaj datumoj. Io kiel &lt;a href="https://mithril.js.org/"&gt;Mithril.js&lt;/a&gt;, reaktiva biblioteko kun limigita amplekso, estas la plej bona, kiun vi povas elekti. Kiam mi uzas Mithril, mia stat-administrada biblioteko estas {}. Ne lasu kadron dikti kiel viaj datumoj devus esti organizitaj!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vi devas izoli vian komercan logikon de JS-kadroj.&lt;/strong&gt; Skribu la kernon de via sistemo kun unu principo: importi la JS-kadron ne estas permesata! Konservu la kodon, kiu uzas la kadron, tre maldika. Ĉi tio estas la sola maniero, ke iom de via kodo povas travivi ĉi tiujn kadrojn, kiuj kutime daŭras nur 4 jarojn.&lt;/p&gt;
&lt;p&gt;Eviti la situacion en kiu via tuta antaŭa finaĵo subite fariĝas aro de heredata kodo estas tiel grava, ke ĝi superas aliajn konsiderojn, kiel la haveblecon de pretaj "widgets" por via kadro. Estas nur &lt;a href="https://vrimar.github.io/construct-ui/"&gt;unu&lt;/a&gt; aŭ &lt;a href="https://github.com/ArthurClemens/polythene"&gt;du&lt;/a&gt; wiĝetaj &lt;a href="https://github.com/orbitbot/awesome-mithril?tab=readme-ov-file#libraries-components--plugins"&gt;bibliotekoj por Mithril&lt;/a&gt; tie ekstere. Por eviti reinventi la radon, ni ŝanĝas al retaj komponentoj (tajloritaj elementoj) por tre kompleksaj aferoj kiel redakteblaj sortigeblaj filtreblaj datumaroj.&lt;/p&gt;
&lt;h3&gt;Preter retaj teknologioj: Flutter&lt;/h3&gt;
&lt;p&gt;La krudeco de retaj teknologioj estas bona kialo adopti ion kiel &lt;a href="https://en.wikipedia.org/wiki/Flutter_(software)"&gt;Flutter&lt;/a&gt;. Ekde 2021, ĝi povas renderi en la reto uzante Kanvason. Kiel ludmotoro, ĝi pentras la ekranon antaŭ ol transdoni la pikselojn al iu stulta surfaco aŭ kanvaso de la platformo sur kiu ĝi nuntempe sidas. Tial, &lt;strong&gt;mia aranĝo neniam rompiĝos&lt;/strong&gt;. Mi ne plu zorgos ĉu retumiloj konsentas pri plej multaj aferoj. Mi ne devos uzi HTML aŭ CSS aŭ retajn kadrojn. La Dart-lingvo ricevis bonegajn trajtojn, kiel nulsekureco (2021). Multaj pli bonaj ol JS kaj tre similaj al TypeScript, do lerni Dart estas facila por plej multaj. Mia Sentry certe enhavos malpli strangajn erarojn de strangaj retumiloj. Kaj neniu bezono iam agordi bundilon.&lt;/p&gt;
&lt;p&gt;CSS? Hahahahahaah... CSS... Bona ŝerco!&lt;/p&gt;
&lt;p&gt;Flutter estas malfermfonta trans-platforma aplikaĵa evoluiga ilaro kreita de Google. El unu kodbazo ĝi generas la saman aplikaĵon por Android, iOS, reto, Vindozo, OS X kaj Linukso. Unu miliono da aplikaĵoj estis kreitaj kun ĝi.&lt;/p&gt;
&lt;p&gt;Flutter havas komencan lernokurbon, certe. Sed longtempe, tio estas multe malpli da peno ol teni sin ĝisdatigita kun krudaj retaj teknologioj!&lt;/p&gt;
&lt;p&gt;Kio pri komencaj programistoj? Kion vi pensas estas pli facila, lerni HTML, poste CSS, poste Javascript, poste Typescript, poste Vue, poste vite (kaj alternativoj)... aŭ lerni Dart kaj poste Flutter?&lt;/p&gt;
&lt;p&gt;Sed oni devas scii kiam uzi ĉi tiun specon de afero en la reto. Flutter estas por aplikaĵoj, ne por enhavaj retejoj. Aplikaĵo Flutter funkcianta en la reto estas pli peza kaj pli malrapida elŝuto, ne eksponas sian enhavon al serĉiloj, kaj ne facile integriĝas kun la alireblecoj de la retplatformo. Konservu vian blogon en HTML, ĉar HTML estis kreita por hiperteksto. Sed ĝi ne estis kreita por retaj aplikaĵoj! Ni devigis retajn aplikaĵojn sur ĝi dum jaroj, misformante ĝin, transformante ĝin en monstron.&lt;/p&gt;
&lt;p&gt;La sola problema estas, ke la rapideco de Flutter estas bona en ĉiu platformo, krome la web, kaj Googlo faras nenion pri tio – ne en 2024, almenaŭ. Aspektas ke la web estas duaklasa platformo por ili.&lt;/p&gt;
&lt;h3&gt;Konkludo&lt;/h3&gt;
&lt;p&gt;Kvankam mi nur komencas kun Flutter, estas jam facile vidi kiel programista produktiveco devus esti pli alta uzante ĝin anstataŭ HTML, CSS kaj TypeScript.&lt;/p&gt;
&lt;p&gt;Mia intereso ne nepre estas fari iOS aŭ Android-aplikaĵojn, ne. Nur faciligu mian vivon. Faru sangantan aplikaĵon, kiu eĉ funkcios sur la sanganta reto, sen postuli, ke mi uzu krudajn retajn teknologiojn.&lt;/p&gt;
&lt;h3&gt;Pliaj pensoj de aliaj homoj&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/eo/posts/crummy-web-tech.html</guid><pubDate>Mon, 20 May 2024 10:59:03 GMT</pubDate></item></channel></rss>