Software engineering is a learning process, working code is a side effect
lambdabytes.io
lambdabytes.io
Quotes:
"The main value in software is not the code produced, but the knowledge accumulated by the people who produced it."
"This is why relying on external vendors for your core software development is difficult. You may get a running system and its code, but the invaluable knowledge of how it is built and what design choices were made leaves your organisation."
Admitting it "officially" ultimately boils down to retaining by all means the engineers who already acquired the knowledge. Some of those will ask for more benefits, others will play games of power, others still will simply refuse to stay once they stopped learning.
(In my industry and geo) businesses chose the opposite -- they slice and dice the knowledge into tiny bins so that a total newcomer can learn up quickly enough. This drives down wages but now requires many more people where a few should suffice.
Solution to that? Total subcontracting of sw development. Which is of course a slow death for the business, but a) at least it looks like a business model, b) death is slow enough so that managers have time to move on, c) this has a merit of being implementable. The alternative -- finding people who already know or learn very fast, and then keeping them -- is not for every budget.
I mostly agree. Admitting it acknowledges the importance of the humans in the system, and diminishes somewhat the allure of the code they write. It pushes for more focus on learning and sharing, and strengthened the labour power of the human interacting with the engineering system, as they're full acknowledged as inseparable from it.
Clients are worried sick that their businesses won’t exist unless they make the right key technology investments. They are worried they will be looking for a job if their contractors can’t deliver. But as long as the contractors learn enough, it’s all good.
Again, speaking specifically of the deliberately provocative headline
The author mixes up How and Why of software engineering. Learning is part of the How of software engineering. The Why of software engineering is to develop and deliver solutions to business clients. Most business client don't care if you learn something or not, they expect results.
I agree, I could have differentiated a bit more on the How and Why, but I think in the end it applies to both: do the customers REALLY always know what they want? They think so, but it is not really the case. Often it is muddled under a premature idea of a solution the client already thought up. Therefore, its better to start with a minimum viable solution (prototype) so the client actually sees and touches something tangible, which will very often change their idea of what they actually REALLY want.
Maybe that's why I find it so hard to get into art.
I used to say "I can't draw", then I sat down and spent about five hours looking at how to draw books, working through the basics, over the course of about three weeks.
Now I can draw, repeatedly, to a certain standard. If I want to learn more I could, but it isn't strictly necessary.
How do you decide you want 'this program'? Why not a slightly different program, or the same functionality implemented with a different approach. It boils down to research and learning, especially for non-cookie cutter projects.
Clients are interested in a working product, as quickly as possible and as cheaply as possible. It's hard enough already to convince them of the importance of non functionals such as reliability, maintainability and security.
> It is no surprise that agile processes have been proven to be so successful and useful: they emphasise collective learning.
What? Every place I’ve seen “agile” practices ended up far overemphasizing short term thinking over any sort of respect for learning and the collective knowledge of the employees of the company. I’m not saying the two are necessarily at odds, but the sort of management that is attracted to agile is also the sort of management that probably doesn’t give two licks about whether you’re learning anything deep, so long as you get the story points closed.
Practicing medicine is a learning process, healing people is a side effect.
See how ridiculous this sounds?
You can't fix a Ferrari without learning about a car's history and the previous owner's maintenance to trouble shoot.
You can't fix a patient without learning about their history and learning about interactions with the treatment you prescribe.
You can't fix something you don't understand, and unique things require a lot of time to figure out.
This applies in many areas. I learned a ton about Atomic Clocks the first time I fixed one... the second time I did it, it was only an afternoon, instead of a week spent in my friend's shop over the course of a month.
So, yes... the main investment is the knowledge learned. It is foolish to waste that effort.
In theory, we could have run one upstairs, and one downstairs to see if we could check relativity... but the tubes have an finite lifespan, so it wasn't worth it.
The Cesium clocks have since been sold... and the memories remain.
"Life is a learning process, happiness is a side effect."
Well, no. but replace automotive engineering - a more direct analogy to software developer - and yes.
> Practicing medicine is a learning process, healing people is a side effect.
As someone married to a physician, you'd actually be surprised how accurate that statement is. There are many thinks we have medical confidence, but there are also many things that we have limited knowledge about - especially new areas of medicine.
----
I don't think your argument sounds that ridiculous. We know a lot about computers. What we often don't know a lot about is the business requirements - which are fundamentally human driven. In my experience, technical knowledge is rarely the limitation for good software. It's an inability to discover the human needs of someone else.
> See how ridiculous this sounds?
That sounds perfectly fine to me. I very much profit from the fact that humanity has been healing people for centuries, because it means that treatments, hospitals, and a whole education system to educate doctors and nurses exist.
The fact that some John Doe survived his surgery in 1923 and made a recovery doesn't help me much at all.
Sounds ridiculous, actually. /j
I think that Naur's "Programming as Theory Building" (1985) communicates this idea succinctly and forcefully. It's not a textbook, though.
"the average tutored student was above 98% of the students in the control class"
I guess "personal advice" is teaching the code's theory, and much better than learning from a one-off textbook (i.e. documentation).The more lightweight you go, the more information is lost. You can easily use hardware made in 60s. Trying to use some software today made half a year ago can be a journey. (Algorithms are another matter, they do sometimes survive if they are well described.)
Learning is involved in anything but it is not the process of making software. It is not the process of anything, as it cannot be put in a neat box for any management. A process is at most output of it.
Maybe you work on a side project with new technologies to learn things - in this case the working code is not as important.
Perhaps you are trying to push a product out quickly - working code is the end goal and you may learn a few things along the way.
I find it disingenuous to say that working code is merely a side effect. As the author says, SE is a learning process and the main challenge is to understand the domain. However how the outputs of the process are ranked in importance is subjective and therefore one can rate working code higher than learning.
Although if you consistently rank working code over learning I would assume you are a poor software engineer.
Rewriting the same thing from memory when I already know how to structure the program is boring but fast.
That's why space stuff has redundancies etc.
- There's only research-programming.
as a practical note, the only development artifact guaranteed to survive the lifetime of the product is the code
Engineering is the process for solving problems, usually at business scale.
Mechanical Engineering solves problems of moving widget A into widget B, at scale of thousands or millions of widgets.
Electrical Engineering solves problems of moving electrical power form point A to point B, at scale of generating and delivering electrical power to millions of customers.
Software Engineering solves problems of moving digital data from point A to point B, at scale of collecting Billions of user data into databases and generating metrics reports.
The same applies to other industries. How do you imagine smart grid does appear?
Learning is part of the How of software engineering. The Why of software engineering is to develop and deliver solutions to business problems.