[HN Gopher] Woo for Its Own Sake ___________________________________________________________________ Woo for Its Own Sake Author : mwcampbell Score : 81 points Date : 2021-01-09 15:50 UTC (7 hours ago) (HTM) web link (scottlocklin.wordpress.com) (TXT) w3m dump (scottlocklin.wordpress.com) | ajkjk wrote: | I suspect the author has a lot more exposure to the kinds of | people who want to write their next web server basically in | category theory than most people actually do, and so thinks that | kind of person is much more common than they actually are. | | But I still like the take a lot, particularly because of the | perfect truth of the line "[Go] is a boring garbage collected | thing that looks like C for grownups, or Java not designed by 90s | era object oriented nanotech fearing imbeciles. " | xyzelement wrote: | There was an article here a few days ago about"incompetent | altruism" or something like that. The commonality is whether | you're laser focused on solving the problem, versus being | obsessed with yourself as the solver. | | The bit about us not being smart enough for some of the | technologies also rings really true. Thinking of a coworker who | was "smart" enough to reach for threads right away, and then | inevitably spent the next 2 years of any project dealing with | thread issues in production. | wpietri wrote: | Exactly. Over the years I've learned to keep my self-indulgence | to my hobby projects. When I'm coding for money, I try very | hard to set aside my ego and do the best thing for the users. | As much as I am personally motivated by novelty and curiosity, | when I'm on the clock I'm a lifetime member of the Boring | Technology Club: http://boringtechnology.club/ | carapace wrote: | "Everyone knows that debugging is twice as hard as writing a | program in the first place. So if you're as clever as you can | be when you write it, how will you ever debug it?" | | https://en.wikiquote.org/wiki/Brian_Kernighan | jka wrote: | It's definitely true, there's a frequent temptation in software | engineering to be drawn to novel technologies. | | That said, the idea of different data types in C could have been | considered a fancy addition by BCPL developers. | | The key is to use critical thinking to determine what | developments may be useful longer-term, and also to watch out for | any (typically accidental) flaws exist in the novelties that are | being proposed - sometimes it takes years, but those can come | back to bite us. | | It may not make business sense to exert effort shifting to new | technologies straight away, but encouraging people to learn the | strengths, weaknesses and properties of them can be valuable | nonetheless. | pnathan wrote: | It depends. | | What are you doing? What are the constraints? What is the | problem? | | Do you need innovation? Do you need plumbing? | | Can you lift your eyes and see the value in a radically new way? | Does it look like what you are already doing, or does a | beginner's mind really suggest a new approach? | | The author sounds like a crabby old guy who doesn't want to | change. Probably an artifact of the topic. But it *is* a real | problem- people get locked into fancy-chasing. This introduces | risk into the project delivery: team based (knowledge) and tech | (not adequately debugged). | | I've worked at length in "fancy" languages and some of the fancy | tech. My conclusion is you have a limited amount of investment | you can do. Some of this is team based (language learning, | keeping the employees happy), some is in product, some is in tech | stack (FlashyFancypants DB and SparklePants.JS). Good tech | leadership includes picking out what to take risks on, judging | appropriate ROI. Note this holds true for open source, not just | business projects! | | I work in a Clojure shop, so I interact with the rewards and | risks of this strategy right now. My last team/company, we chose | Go for the team language. It wasn't as unilaterally good as some | might hope. Nor was it as unilaterally as bad! It was just | another language. | closeparen wrote: | The "just solve the problem" attitude also gets used as an excuse | to ship the worst code that can get through user acceptance | testing. | | The worst bridge that can stand up to the load is good, cost | efficient engineering. The worst code is not. One, because bad | code hides bugs that you probably don't have rigorous enough | testing to find. Two, because there will be new demands on that | code in the future, and bad code is harder and riskier to change. | You might look like a responsible adult when you ship it today, | but three years later the new maintainers will know you were a | child making a mess. And probably end up doing a rewrite, or at | least needing to. | | All this "woo" with languages and frameworks and services and | whatever else, is the search for higher quality code. | | There is a certain myopia about new things vs. getting better at | design with old things. There is a certain blindness to iterative | improvement, e.g. Rust is much sexier than modern C++ as a | solution to the problems of C++98. But rather than condescending | to this you can channel the energy into more responsible | directions. | | I work in a team where many people have zero aesthetic | sensibility about code. Not like "I know this is ugly but we have | to get it done today" or "I know this is ugly but it's the best | we could come up with," just zero sense that it's ugly. Grass is | not greener. | peterkos wrote: | Trying to explain that code is more than "well, it works!" is | especially hard. Maybe its just the part of programming that's | more an art than a science? | ilovefood wrote: | This was a fascinating and funny read. What a great writing style | and strong opinion. I had to agree with most of it! | throwanem wrote: | > I'm imagining the archetypical unicycle-juggler buying a shop | full of solid printers and weird CNC machines and forgetting to | buy cutters, hacksaws, files and machinist squares. | | In 2020 we call this a "makerspace". | jfoutz wrote: | this is a funny and thought provoking article. There's a bit of | texture that I feel is missing, and I feel personally attacked, | so I'm going to throw up a weak defense of category theory web | servers. | | Back in the day, in perl I'd bless regexes and use AUTOLOAD to | provide the class implementations at runtime, as any good | unicycle rider would. Changing the Rube Goldberg machine is hard. | grep won't really help. I'd resort to even dirtier tricks to | change behavior. | | Later I worked in java. grep would work, but even better, I could | make a class private, create an interface and just chase compiler | errors. So much nicer than hunting down the right line of code to | hijack in perl. It's pretty good, and I think go provides a | similar level of support, but there's still a bunch of room for | Class.forName(foo); //haha! grep will never find me! and it's | cool, cause you'll only find out about it at runtime. | | Anyway Haskell is neat because you can throw it all in a do in | IO. hack away for days. When it's time to change, just change it. | the compiler will help. The compiler will tell you everything you | need to know to scope down to the finest level you want. It's | super easy to be way too fancy up front, but any mistakes can be | fixed. | | Anyway, Haskell is probably never the right choice but it's the | only thing I know of that lets you easily change the design | whenever you feel like it. | | It's Saturday, and I've thought about this too much. Time to put | on my silver pants and go unicycling. | barnacled wrote: | One thing I've noticed in my career is that those who possess a | certain kind of 'wow' factor are the ones who are categorised as | the 'stars' and thus progress quickly through the technical | ranks. | | I've tended to find that these people don't write particularly | good code (not usually bad, just mediocre) and tend to lack | ability in software engineering - writing deeply unrobust code | that falls far short of their perceived 'rockstar' qualities. | | I can't tell you the number of conversations I've had with | managers or even colleagues where their untouchable genius is | extolled to the heavens. | | Combine this with the fact that those who raise issues and | foresee problems are often viewed poorly (possibly even MORE so | if those problems actually end up happening). | | Ultimately you end up with a situation where those who advocate | for solid engineering are, while respected, never really raised | above the low levels of the career ladder and those who embrace | woo rise up. | dkarl wrote: | I had a few job interviews last year where it was clear the | people trying to hire me had plenty of programming talent on | board already. They were just looking for a technically competent | adult who could look at what was going on and figure out why all | the fancy work that was getting done was not doing what the rest | of the company needed and expected. | | One company had several different teams of programmers that were | great at building things, but they were all going in different | directions with different tech stacks (two in Go, one in Rust, | and one in Python) and completely different data models for the | company's basic business domain. When a directive came down from | above that two systems HAD to be integrated, because a customer | paying for one product wanted the other one as well, as sales and | product had been hoping and planning since before the products | were built, the engineers gave them an estimate of four months to | do the integration. The business knew that meant 8+ months. How | many programmers did they have to get this disjointed? Less than | twenty. | | Lots of other companies have similar stories. I disagree that it | is about lack of financial compensation. These companies were | paying good money, and their engineers were living comfortably | and abusing the relationship, whether wittingly or unwittingly. | | Anybody who reads HN can whip up an impressive, Netflix-blog- | worthy design for any problem their company has. If their company | is unlucky, they might even have the energy and raw hacker | ability to get it mostly working. Where we're failing as a | profession is in educating people that this is poor engineering, | that it's bush league bullshit. It isn't impressive. It doesn't | show any ability except a certain amount of shallow raw | intelligence, which is necessary and valuable, but which is more | like raw material to build ability out of than ability itself. | | In other forms of engineering, the culture is very clear: | simplicity is an achievement. Solving an easy problem with a big, | expensive solution is not an achievement. It's unskillful. The | best engineers come up with solutions that make you see the | problem as an easy one. Solving easy problems with difficult | solutions proves you aren't qualified to take on the problems | that need those solutions. How do we establish this as a standard | belief in software engineering as well? | rdiddly wrote: | I almost hate to say it, but the answer to your last question | might lie in instituting the kind of standards, credentialing, | mentorship and licensing that exist in the "real" engineering | fields. Stuff that will correctly be called out as | unfortunately really "hampering individual freedom" (including | the freedom to be a jackass) and being "unnecessary" and | "bureaucratic" and (quite intentionally and without quotation | marks) gatekeeping. | | Civil engineering is sort of the oldest and ultimate example, | where a bad design puts people's lives at risk. In deference to | said lives, senior engineers in that field review every drawing | or calculation that goes out the door, and they also mentor the | junior engineers, who have to be graduates of accredited | schools, and also can't get certified until they've spent a | certain amount of time being mentored and passed the exams, | etc. | | The mindset you're talking about is basically all about | craftsmanship or elegance of a solution. Formal mentorship or | apprenticeship programs do a great job of maintaining and | transmitting that. School isn't really enough, and certain | fields have recognized that fact. | | In software however, and I'm not sure whether this is the | problem or the symptom, the number of developers apparently (I | was told recently) doubles approximately every 5 years. Which | means the field is always overwhelmed with new people, full of | energy but not experience, who want to do something cool and | exciting, but haven't been, for example, burned by their own | past decisions to try to do something cool and exciting. They | see only upside. Which is valuable in itself, but they need | more direction than they're getting, from the older engineers | who have the war stories and who aren't especially concerned | with being cool (which c'mon let's face it, is essentially a | mating display) and who are _boring_. | fractionalhare wrote: | A lot of what you describe is attributable to resume-driven | development, in my opinion. Complex solutions are used to | insinuate that the engineers who implemented them are solving | complex problems. This in turn improves their marketability by | insinuating they've got the razzle dazzle and trendiness under | their belt that justifies $500k a year. | | Sometimes it's also not resume-driven development, at least not | intentionally. Sometimes it's because the engineers just want | to work on overcomplicated shit. For example I have my personal | blog running on half a dozen AWS features - S3, Athena, | Cloudfront, Cloudwatch, Lambda, SNS, SES, ... | | I don't _need_ any of that for a simple blog, and I write on it | like once a year. And the site is still slow as shit | (relatively) even though it 's static because I haven't | optimized the font and script loads to be non-blocking. But it | was fun to set up! | dkarl wrote: | I agree about the resume-driven development aspect, and I | think it's great to use a personal project as an outlet for | experimentation! Too many people do stuff like that at the | expense of unnecessary complexity in production systems. | | I'll grant that collectively an engineering team might decide | to overengineer a simple, noncritical service to get | production experience with a technology or two that they are | targeting for future adoption. Nothing wrong with that, and | there's nothing wrong with making room in the schedule for | engineering experiments to test out new technologies. | | Managers and the rest of the business, for their part, need | to understand the need for experimentation so it can be done | honestly and not under the guise of other work. | m463 wrote: | Folks with the outside perspective often attribute some | intent to a situation, but if they went through it, it would | be obvious and simple. | | I think engineers try to do the best they can. It's just old | guys might do it the mainframe way, slightly younger unix, | then windows, then linux. | | Or folks who've been with the culture do it that way, and new | folks from outside the company bring new college grad or | last-company-i-worked-for culture along with them. | | And folks who try something new suffer from the 'fog of war' | and your "the docker solution" that got everything started so | well makes you a real expert in nested docker configurations | and firewall issues. :) | tomsmeding wrote: | What you describe you did with your blog is, in some sense, | resume-driven development: you probably learned stuff in the | process, which might be useful in a future job situation. | | The difference is that nobody paid you for doing all that | unnecessary stuff. Doing unnecessary things for learning is | good, but not what a company is paying you for, usually. | sseagull wrote: | There is also an element of each project optimizing to its | own minimum. If each project selects the best language, tech | stack, hosting stack, etc, for itself, it creates an | overarching complexity across projects. | | Fixing this requires lots of communication and leadership. | Each project may need to select sub-optimal components (like | language) for itself, but in doing so it can remove overall | complexity. | ChrisSD wrote: | As you ask for simplicity, I think this can be succinctly | summed up as a lack of engineering leadership. | | I know having completely independent teams is the in thing but | there needs to be some high level design and coordination. I'm | not even against different teams using different tools but the | integration story has to be there from day zero if it's a | business requirement. | | Ultimately there needs to be an engineer who has both the power | and knowledge to coordinate design decisions. | dkarl wrote: | I agree with this 100%, and I think the people providing this | leadership should be in management. Software engineers need | to be managed by someone who can understand and evaluate | their work, because of what you said and also because other | aspects of management benefit from the ability to cast a | critical eye over the work being done as well. | | EDIT: Going further, I think the people trying to hire me as | an engineer to fix their problems should have replaced their | front-line management with managers who understood code, so | they had some clue what their engineers were doing wrong and | how to fix it. The idea that engineers should be able self- | manage is a rare best case scenario, not a best practice that | can be replicated across the industry. | userbinator wrote: | _In other forms of engineering, the culture is very clear: | simplicity is an achievement. Solving an easy problem with a | big, expensive solution is not an achievement. It 's | unskillful. The best engineers come up with solutions that make | you see the problem as an easy one. Solving easy problems with | difficult solutions proves you aren't qualified to take on the | problems that need those solutions. How do we establish this as | a standard belief in software engineering as well?_ | | My experience with things like foreign automotive components | suggsts this is not exactly true in general... but it's true | that monsterously complex solutions seem to be far more common | in the software world. | brundolf wrote: | I think part of the difference in mentality comes from the | difference in material constraints. | | If a mechanical engineer designs something that needs a ton of | fancy moving parts, those moving parts significantly and | directly impact their budget (I assume), because they're going | to have to be purchased or made for each widget that gets | manufactured. They also unavoidably impact physical properties | of the object, like weight and dimensions. | | Whereas a programmer can spin out as much code as they want, | basically without material consequence. There is no constant | gravitational force keeping them in check, requiring them to | justify each piece of complexity as they go. It's ethereal, | weightless, and its disadvantages usually only surface years | down the line. | dkarl wrote: | In my experience, the costs are felt immediately, because | there is more code and more complexity. Virtually every cost | in software development goes up when there is more code and | more complexity. There are more bugs. It takes longer to | diagnose and fix bugs. It takes longer to add new | functionality. Performance is less predictable, and | performance problems are harder to diagnose. Onboarding new | programmers is slower. Fewer members of the team can do | critical work on the code. Routine library upgrades are more | likely to impact the code and take longer when they do. | | Code is a liability, in other words. It may not be tangible, | but you can think of it as weight that the team has to carry | everywhere it goes. | brundolf wrote: | You're totally missing my point, which is that all of those | costs are abstract and protracted. They aren't felt as | you're literally typing the characters; they can't be | listed as concrete numbers in a budget. If an engineer is | using a CAD tool and they add a part, they can see the | space that's no longer available for other parts. Or they | can see that the product would have to be made physically | larger to accommodate it. There is concrete feedback to | contend with _during_ the development process, not just a | vague notion of future reliability. | SkyMarshal wrote: | Tools should be chosen to match the use case. Haskell is a good | choice when you've got: | | 1) a problem that requires a very high-assurance system with very | low tolerance for bugs, errors, and failures, and | | 2) a large complex system where refactoring and other | maintenance-over-time activities are made materially more | manageable by Haskell's strong type system and other tools, | | 3) a need for large-scale parallelization that a purely | functional language like Haskell facilitates, and | | 4) a world class team of engineers who can become productive in | it relatively quickly, support new hires doing so too, and won't | foreseeably be outsourced to some low cost overseas sweat shop. | | Rust is also worth considering under those criteria, in addition | to embedded systems, hard/soft real-time or constant-time | systems, etc. | | But obviously not all software projects have all those criteria. | Other languages like Go, Python, Javascript, Java-ecosystem, | .Net, etc may be ideal in other circumstances. You just have to | match the tools for the job. | paulryanrogers wrote: | Article seems to be implying at a big company you probably | can't have #4 and may not even need #1. | draw_down wrote: | Keep it simple, use boring tech, etc. We know. The whole issue is | what is boring, what angle we wish to view simplicity/complexity | from. These pretty much always boil down to "what I like". What I | like is simple and boring, your stuff is shiny and | overengineered. | JKCalhoun wrote: | He gave examples that would be more accurately described as | "tried and true" not "your stuff" -- the code that has been | battle tested in the field for decades. | JKCalhoun wrote: | The whole article is genius (and funny) and rings true from many | years experience in the biz. | | > I'm imagining the archetypical unicycle-juggler buying a shop | full of solid printers and weird CNC machines and forgetting to | buy cutters, hacksaws, files and machinist squares. As if files | and machinist squares are beneath them in current year. | | Of all the things I could have commented on, I have to call out | this last line simply because I only just saw a YouTuber last | week 3D-print a part for a project he was working on: the part | was the exact size and shape of a 4-inch long piece of standard | PVC pipe you could pick up from Home Despot for a few bucks and | saw the length you wanted in a few seconds. | 542458 wrote: | In the last few months I've printed a few parts that could be | bought OTS because I don't want to go into a store in the era | of COVID. | | More generally, I've also printed stuff you can buy OTS because | it can be less labor than going to the store, and occasionally | cheaper. Also, sometimes it's just more fun. | netizen-9748 wrote: | While I absolutely understand the fun factor, is it really | less labor to draw something in a CAD program than make a cut | or two? | 542458 wrote: | Less labour than driving to the store, finding the part, | buying it, driving home, and carefully making an accurate | cut with a hacksaw :) | michaelcampbell wrote: | > Home Despot | | So edgy. ___________________________________________________________________ (page generated 2021-01-09 23:01 UTC)