33<div class =" sans-text " >
44
55** Joshua Levy** ([ GitHub] ( https://github.com/jlevy ) , [ Twitter] ( https://x.com/ojoshe ) )\
6- * v0.1.10 (July 2025) – Draft!*
6+ * v0.1.11 (July 2025) – Draft!*
77
88<div class =" boxed-text " >
99
@@ -175,9 +175,8 @@ time.
175175
176176## The Complexity of Software Engineering
177177
178- > “Technology is the solution to human problems, and we won’t run out of work till we
179- > run out of problems.”
180- > —Tim O’Reilly[ ^ oreilly ]
178+ > “* Technology is the solution to human problems, and we won’t run out of work till we
179+ > run out of problems.* ” —Tim O’Reilly[ ^ oreilly ]
181180
182181### What is Technology?
183182
@@ -199,14 +198,13 @@ problems.
199198People (even programmers and tech leaders) make confused statements about programming
200199and engineering[ ^ progvseng ] surprisingly often.
201200
202- The thinking seems to be: Programmers write code.
203- But now AI writes code.
204- In fact, it writes code better than most programmers.
205- Therefore programmers are no longer needed.
201+ The thinking seems to be: * Programmers write code.
202+ But now AI writes code—in fact, better than most programmers.
203+ Therefore, programmers are no longer needed.*
206204
207205In my view, this reasoning reflects a deep misunderstanding of what engineering is.
208- It is a bit like confusing writing with typing.
209- Writing certainly involves typing (at least, it does today), but it’s a woeful
206+ It is a much like confusing writing with typing.
207+ Writing certainly * involves* typing (at least, it usually does today), but it’s a woeful
210208misunderstanding to think the value of a writer is their typing
211209ability.[ ^ combinedskills ]
212210
@@ -221,8 +219,17 @@ best solve the problem.
221219It takes time and effort to * explore* the problem and possible solutions.
222220Engineering is a practical exploration of solutions to a problem.
223221
224- Not everyone would give this definition, but I hope I can convince you this is the
225- correct one.
222+ <div class =" boxed-text " >
223+
224+ *** Software engineering** is the precise exploration of software solutions to human
225+ problems.*
226+
227+ </div >
228+
229+ ### Why We Will Always Need Engineers
230+
231+ Not everyone would give this definition of engineering, but I hope I can convince you
232+ this is the correct one,
226233
227234Just for fun, let’s take a hypothetical example.
228235
@@ -244,17 +251,10 @@ The more clever or determined users would start *exploring* what they really wan
244251Changing B to D or adding a special case E, and so on.
245252
246253You know what you’d call those determined, unusually analytical users who were good at
247- figuring out what they really wanted ?
254+ figuring out what people really want ?
248255
249256You guessed it: engineers.
250257
251- <div class =" boxed-text " >
252-
253- *** Software engineering** is the precise exploration of software solutions to human
254- problems.*
255-
256- </div >
257-
258258### What is Good Engineering?
259259
260260Another fundamental question is, why is software engineering so hard, both for humans
@@ -284,8 +284,8 @@ solutions.*
284284You need to do it quickly but at the same time without getting bogged down by details
285285that aren’t really relevant to the problem.
286286
287- As one of the best engineers I know describes it, “good engineering is moving fast but
288- not painting yourself into a corner.”
287+ As one of the best engineers I know puts it, “good engineering is moving fast but not
288+ painting yourself into a corner.”
289289
290290### Product vs. Infrastructure Engineering
291291
@@ -312,47 +312,87 @@ engineering*.
312312
313313This distinction can help resolve some confusions.
314314
315- For example, most arguments between engineers on things like software architecture and
316- programming languages are not about product engineering.
315+ For example, you’ve probably seen heated arguments between engineers on things like what
316+ database to use, which programming langauge is better, or if microservices are a
317+ mistake.
317318
318- Product-thinking people often find these arguments confusing or distracting .
319+ Product-thinking people often find these arguments confusing or just a waste of time .
319320
320- But it ’s because they are not about product engineering.
321- They are about infrastructure engineering: they are arguments about * what infrastructure
322- will lead to future sustained velocity for other engineers* .
321+ That ’s because they are not about product engineering.
322+ They are about * infrastructure engineering* : they are arguments about * what
323+ infrastructure will lead to future sustained velocity for other engineers* .
323324
324325Product-oriented people most respect people who give solutions to users.
325326Engineering-oriented people most respect engineers who help other engineers be more
326327productive.
327328
328329These observations have applied for decades on software teams.
330+ But this observation has new relevance today with LLMs.
329331
330- But it has new relevance today with LLMs.
331332LLMs are currently best implementing clear specifications.
332333Product engineers can often give clear specifications.
333- However, infrastructure engineers are problems for other engineers.
334- It’s harder to give specifications for infrastructure engineering because so aspects are
335- non-obvious, second order, and take time to observe.
334+
335+ However, infrastructure engineers are solving problems for * other* engineers.
336+ It’s much harder to give specifications for infrastructure engineering because almost
337+ every hard decision is non-obvious, second order, and takes time (often years!)
338+ to observe.
339+
340+ To a junior engineer, Java and Python may both seem perfectly fine for writing programs.
341+ Similarly, Postgres and MongoDB might seem like just two different ways to store data.
342+ To an experienced engineer, these are radically different technologies.
343+ This is because they have years of experience with the non-obvious and painful ways each
344+ of these tools caused them problems.
336345
337346LLMs help all engineers, but they can do more for product engineers than for
338- infrastructure engineers.
339- So human engineering effort is increasingly about infrastructure engineering.
347+ infrastructure engineers, because LLMs are best at pattern matching from training data.
348+ Such pattern matching works better for features (which are typically written using
349+ similar languages and syntax) than for infrastructure (which can change the way you
350+ solve problems entirely).
351+
352+ There are two consequences of this.
353+ First, this means human engineering effort is increasingly about infrastructure
354+ engineering. helps human engineers be more productive also helps LLMs be more produtive.
355+ And secondly, good infrastructure, once it is used in training data, also helps LLMs.
340356
341357<div class =" boxed-text " >
342358
359+ * LLMs are better at product engineering than at infrastructure engineering.*
360+
343361* LLMs make (human) product engineers more effective.*
344362
345- * (Human ) infrastructure engineers make LLMs more effective.*
363+ * But (human ) infrastructure engineers are what make LLMs more effective.*
346364
347365</div >
348366
349- ### Three Types of Complexity
367+ Let’s give an example of the last point.
368+
369+ Almost all engineers readily acknowlege that CSS is overly complex and full of pitfalls.
370+ Thankfully, many people now say, LLMs know CSS and can now handle the things that were
371+ previously error-prone for humans.
372+
373+ This is true. But what is often overlooked is that another thing is also true: if it’s
374+ hard for humans, it’s also hard for LLMs!
375+
376+ It is * relatively* far more productive to use an LLM with good infrastructure than it is
377+ with bad infrastructure.[ ^ infravsllm ]
378+
379+ <div class =" boxed-text " >
380+
381+ * If you can minimize irrelevant complexity for an LLM while staying within the scope of
382+ the training data, you can achieve more with the same LLM.*
383+
384+ </div >
350385
351- > People will strive to experience an equal or increasing level of complexity in their
352- > lives no matter what is done to reduce it.
353- > —Bruce Tognazzini
386+ Minimizing accidental complexity for engineers and LLMs is (for a while at least) still
387+ the job of human infrastructure engineers.
354388
355- Let’s mention another word that has a few distinct meanings in engineering: complexity.
389+ This brings us to another word that has a few distinct meanings in engineering:
390+ complexity.
391+
392+ ### Three Types of Complexity
393+
394+ > “* People will strive to experience an equal or increasing level of complexity in their
395+ > lives no matter what is done to reduce it.* ” —Bruce Tognazzini
356396
357397An alternate and important way to frame the concept of good engineering is originally
358398due to Fred Brooks: good engineering involves exploring the * essential complexity* of a
@@ -363,7 +403,7 @@ This is actually just a reframing of the same definition above of sustained velo
363403Having too much accidental complexity is a common way engineering slows down and becomes
364404ineffective.[ ^ techdebt ]
365405
366- In fact, I think it’s best to think of three kinds of complexity that arise in
406+ In fact, I think it’s best to think of * three* kinds of complexity that arise in
367407engineering:
368408
369409- ** Natural complexity:** If you are building an airplane, you need a good understanding
@@ -647,10 +687,10 @@ that need ongoing resolution.
647687
648688<div class =" boxed-text " >
649689
650- Socio-technical systems require a combination of both ** exact** and ** inexact**
651- procedures.
690+ * Socio-technical systems require a combination of both ** exact** and ** inexact**
691+ procedures.*
652692
653- Exact and inexact procedures are qualitatively different and not interchangeable.
693+ * Exact and inexact procedures are qualitatively different and not interchangeable.*
654694
655695</div >
656696
@@ -677,11 +717,11 @@ and deal with issues personally.
677717
678718<div class =" boxed-text " >
679719
680- Exact procedures can be composed easily: combine them and the result is an exact
681- procedure.
720+ * Exact procedures can be composed easily: combine them and the result is an exact
721+ procedure.*
682722
683- Inexact procedures can only be composed with care: if you combine them naively the
684- result is likely to be useless.
723+ * Inexact procedures can only be composed with care: if you combine them naively the
724+ result is likely to be useless.*
685725
686726</div >
687727
@@ -695,7 +735,7 @@ The design of systems of inexact processes is qualitatively different from pure
695735engineering.
696736This is why many generic early “agent frameworks” were not as useful as they
697737at first may have seemed.
698- Agent frameworks often are trying to componse lots of inexact processes, blindly hoping
738+ Agent frameworks often are trying to compose lots of inexact processes, blindly hoping
699739the composition would work.
700740
701741### Is English the New Programming Language?
@@ -722,9 +762,9 @@ next month will do the same thing 99.9% of the time.
722762
723763<div class =" boxed-text " >
724764
725- English is ideal for documenting inexact procedures.
765+ * English is ideal for documenting inexact procedures.*
726766
727- Code (of some form) is ideal for documenting exact procedures.
767+ * Code (of some form) is ideal for documenting exact procedures.*
728768
729769</div >
730770
@@ -833,10 +873,10 @@ This may be a bold statement, but I think it’s worth exploring its implication
833873
834874## The Metaphor of Linting
835875
836- > “When you make it harder to do the basic parts of an activity, the more advanced parts
837- > become almost impossible … Tools don’t only make things easier: they allow us to
838- > augment ourselves to do things that were previously impossible.”
839- > —Doug Engelbart[ ^ aug ]
876+ > “* When you make it harder to do the basic parts of an activity, the more advanced
877+ > parts become almost impossible … Tools don’t only make things easier: they allow us to
878+ > augment ourselves to do things that were previously impossible.* ” —Doug
879+ > Engelbart[ ^ aug ]
840880
841881### A Brief History of Linting and Type Checking
842882
@@ -1452,6 +1492,11 @@ License](http://creativecommons.org/licenses/by-sa/4.0/).
14521492 This is the real reason for the classic startup advice to ship fast and
14531493 iterate.[ ^ leanstartup ]
14541494
1495+ [ ^ infravsllm ] : Another way to think of this is, LLM training is generally not the most
1496+ efficient way to design infrastructure, because essential information (such as the
1497+ difficulty of writing code, or how error prone that code is in a given framework)
1498+ simply isn’t in the training data (at least so far).
1499+
14551500[ ^ nosilverbullet ] : Frederick P. Brooks, [ * No Silver Bullet—Essence and Accident in
14561501 Software
14571502 Engineering* ] ( https://worrydream.com/refs/Brooks_1986_-_No_Silver_Bullet.pdf ) , 1986.
0 commit comments