[HN Gopher] Accidentally Load Bearing
___________________________________________________________________
Accidentally Load Bearing
Author : jamessun
Score : 325 points
Date : 2023-07-20 13:29 UTC (9 hours ago)
(HTM) web link (www.jefftk.com)
(TXT) w3m dump (www.jefftk.com)
| orobus wrote:
| [dead]
| JohnMakin wrote:
| I have seen too often overly complicated systems where one small
| change creates these situations that go unnoticed for far too
| long and then something breaks in a mystifying and spectacular
| way. The reaction, generally, is then a fear to make any change
| to the system at all, regardless of how benign, even if it can't
| possibly mess something up - because of fear of the "unknown."
|
| IME, having robust alerting and monitoring tools, good rollback
| plans and procedures/automation should eliminate this fear
| entirely. If I was afraid to touch anything for fear of breaking
| it, I'd likely never get anything done.
| ninkendo wrote:
| > having robust alerting and monitoring tools, good rollback
| plans and procedures/automation should eliminate this fear
| entirely.
|
| Sure, but that all sounds like stuff that happens after you
| deploy/release... you really need to catch things sooner than
| that. Don't make the user into the one who has to find the
| breakage, please. No matter how fast you roll back. Test your
| software thoroughly!
| JohnMakin wrote:
| Nothing I said implies the user has to find it. With rolling
| deployments and blue/green strategies, bad changes don't even
| have the potential to go live.
| dclowd9901 wrote:
| This is precisely the reason so many developers have come to love
| functional programming and side-effect-free designs. If that stud
| _can't_ affect anything outside of its original intended purpose,
| it can more easily be understood for its purpose and maintained
| or removed more easily.
| dventimihasura wrote:
| > I could easily tell why it was there: it was part of a
| partition for a closet.
|
| > Except that over time it had become accidentally load bearing
|
| > through other (ill conceived) changes to the structure this
| stud was now helping hold up the second floor of the house
|
| Evidently, you couldn't easily tell why it was there. Moreover,
| I'm not persuaded that it accidentally became load bearing. It
| seems quite plausible that it deliberately became load bearing,
| for reasons which are ill conceived to you but not to the people
| who had them.
| lmm wrote:
| > Evidently, you couldn't easily tell why it was there.
|
| No, they could tell why it was there. It's just that knowing
| why it was there in the first place doesn't tell you what it's
| doing now.
| binarymax wrote:
| I feel like part of the story is missing. Did he remove the stud
| and learn the hard way?
| [deleted]
| jefftk wrote:
| _> > How did you find out the closet partition stud was load
| bearing, in the end ?
|
| > I tried to cut it and it started to bind the saw. I stopped
| and thought, and then did not cut anymore until I had shored up
| the upstairs._
|
| https://www.jefftk.com/p/accidentally-load-bearing#fb-231219...
| Ensorceled wrote:
| >> I tried to cut it and it started to bind the saw. I
| stopped and thought, and then did not cut anymore until I had
| shored up the upstairs.
|
| This is exactly I found out that a stud was now load bearing.
| h2odragon wrote:
| A smack with a hammer can tell you all sorts of things. If
| the board is rotten; some is likely to come off. If it's
| under tension it'll sing out with a resonance absent from a
| board carrying only its own weight.
|
| In your circumstance, the board _should_ have had some wiggle
| but prolly wouldn 't have.
| dventimihasura wrote:
| > It is extremely probable that we have overlooked some whole
| aspect of the question
|
| https://www.reddit.com/r/ProgrammerHumor/comments/q9x1d2/ask...
| 7402 wrote:
| I used to work with a physics postdoc who would sometime leave a
| sign on an equipment setup that read, "Do not touch. There are
| hidden dangers."
|
| The lab was full of smart people who were used to looking at
| things and making their own well-reasoned conclusions about
| whether it was OK to change something. This was a warning not to
| be too hasty about doing that!
| pickledish wrote:
| This (the unimportant stud becoming load bearing later on) makes
| sense, but in my experience it's kind of a sign of lazy design.
| When making software at least, you know when you're trying to use
| a decorative stud to hold up part of your house, and choosing to
| do it anyway instead of building some new better structure does
| make for a pretty sad dev team later on
|
| This is to say --- I agree with the article, but much nicer is to
| work at a place where you don't expect to make this particular
| discovery very often, hah
| bjornasm wrote:
| >When making software at least, you know when you're trying to
| use a decorative stud to hold up part of your house
|
| Do you? Sometimes quick-one-time fixes becomes the center of
| important software.
| im3w1l wrote:
| Let's say you code defensively. You add some handling invalid
| input to your function. Because the rest of your codebase never
| sends it invalid input it's dead code - not load bearing. Until
| at some point a bug is introduced and sends you invalid input
| which is then dutifully handled and recovered from. The branch
| has become load bearing.
| dkarl wrote:
| > in my experience it's kind of a sign of lazy design
|
| Is it always lazy in the bad way, though? In software there's
| no sharp distinction between "built to carry weight" and "built
| to tack drywall onto." Whether a system is robust or
| dangerously unscalable depends on the context. You can always
| do the thought experiment, "What if our sales team doubled in
| size and then sold and onboarded customers as fast as they
| could until we had 100% of the market," and maybe using your
| database as a message queue is fine for that.
|
| If it results in a sad dev team, then that's a case where it
| was a mistake. It's hard to maintain, or it's an operational
| nightmare. That isn't the inevitable result of using a
| (software) decorative stud as a (software) load-bearing
| element, though. There are a lot of systems happily and
| invisibly doing jobs they weren't designed for, saving months
| of work building a "proper" solution.
| dylan604 wrote:
| >When making software at least, you know when you're trying to
| use a decorative stud to hold up part of your house, and
| choosing to do it anyway instead
|
| Whenever I find myself doing this, I at least leave a comment
| typically worded along the lines of "the dev is too lazy, not
| enough time to do it right, or just has no clue what to do, so
| here you go..."
| andrewaylett wrote:
| I've been happily running a service that's non-critical, only
| to discover when we have an outage (that should be a non-event)
| that another team has started relying on it for something
| business critical.
| jefftk wrote:
| This was famously a problem for Google's distributed lock
| service, Chubby. They handled it by intentionally having
| outages to flush out ways it might have started to bear loads
| it wasn't designed for: https://sre.google/sre-book/service-
| level-objectives/#xref_r...
| Qwertious wrote:
| s/lazy/lack of/
|
| Hidden files in unix were a _bug_.
| troupo wrote:
| And then .DS_Store in MacOS was basically a bug, too. A lack
| of understanding coupled with a lack of design.
| herpdyderp wrote:
| > you know when
|
| More often than not I've seen this happen because they, in
| fact, do not know.
| cesaref wrote:
| Well, let's say you are working on a well engineered and tested
| product, and you look at the code coverage, and there's a whole
| lump of functionality that has no coverage.
|
| You could conclude that the code is unnecessary and remove it,
| or you could conclude that some test cases need to be added to
| exercise it. How do you decide which is correct?
|
| The problem is usually that well thought and and designed
| software was build for a moving target, and invariably things
| have changed over time. It's not necessarily a sign of lazy
| design, it's where the real world intersects with the nice neat
| pretend world we design for :)
| convolvatron wrote:
| I'm deeply frustrated at the missing answer here. read the
| code. figure out what's it for. take out it and see what
| breaks. software is not a house, you can completely wreck it
| and set in back exactly the way it was in a second.
|
| there is no excuse for not owning and knowing the software
| you are supposed to be in control of.
| cesaref wrote:
| Well, if it isn't covered, then you can take it out, and
| see what breaks (nothing) and then discover in production
| why it was there :)
|
| But yes, it's basically what the job comes down to - having
| a strategy for managing complexity in all it's forms, and
| this is a fine example of the sort of problem that you
| don't learn in college.
|
| I've (thankfully) never deprecated code and caused serious
| production issues, but i've seen it happen. The best places
| to work expect this sort of issue, and have process in
| place to roll back and deal with it, like any other
| business continuity issue (e.g. power/network loss).
|
| The moment you find yourself scared of changing code
| because you don't understand the consequences then you've
| basically lost the battle.
| bgribble wrote:
| > you know when you're trying to use a decorative stud to hold
| up part of your house
|
| "You" might know it in "your" creations, but in my career I am
| much more often working and reworking in other people's
| creations.
|
| I think the point of the article is not that you should avoid
| using decorative studs as load-bearing elements, but that you
| should be aware that others may have done so before you came
| along.
|
| This is an even more conservative position than the default
| Chesterton's Fence reading, which is itself dismissed by a lot
| of people as pedantically restrictive.
|
| For me, the parent article resonates. I have definitely had
| ceilings come crashing down on my head when I removed a piece
| of "ornamental" trim (programmatically speaking)
| jerf wrote:
| "This is an even more conservative position than the default
| Chesterton's Fence reading, which is itself dismissed by a
| lot of people as pedantically restrictive."
|
| In a normal, real-life context, I can see why someone would
| feel that way.
|
| In a software engineering context I think it's just a further
| emphasis that you ought to _understand_ what something is
| doing before fiddling with it, and both the original intent
| and what it is currently doing are interesting information.
| Many times I 've removed dead code, only to learn that not
| only was it alive (which wouldn't have been that surprising,
| it's easy to miss some little thing), but that it is _very_
| alive and actually a critical component of the system through
| some aspect I didn 't even know existed, which means I badly
| screwed up my analysis.
|
| The differences between the physical world and the software
| world greatly amplify the value of the Chesterton's Fence
| metric. In the physical world we can all use our eyes and
| clearly see what is going on, and while maybe there's still a
| hidden reason for the fence that doesn't leap to mind, it's
| still a 3-dimensional physical problem in the end. Software
| is so much more interconnected and has so much less regard
| for physical dimensions that it is much easier to miss
| relationships at a casual glance. Fortunately if we _try_ ,
| it's actually _easier_ to create a complete understanding of
| what a given piece of code does, but it is something we have
| to _try_ at... the "default view" we tend to end up with of
| software leaves a lot more places for things to hide on us.
| We must systematically examine the situation with intention.
| If you don't have time, desire, or ability to do that, the
| Chesterton's Fence heuristic is more important.
|
| We're also more prone to drown under Chesterton's fences if
| we're not careful, though. I've been in code bases where
| everyone is terrified to touch everything because it seems
| like everything depends on everything and the slightest
| change breaks everything. We have to be careful not to
| overuse the heuristic too. Software engineering is hard.
| wpietri wrote:
| In software, I would strongly disagree with this:
|
| > you ought to understand what something is doing before
| fiddling with it
|
| I think understanding before fiddling is one option. But I
| think a better option is often fiddling and seeing what
| happens. The trick is to make it so that fiddling is safe.
| E.g., on a project where I have good test coverage and find
| mystery code, I can just delete it and see what fails. Or I
| set up a big smoke test that runs a bunch of input and
| compares outputs to see what changes.
|
| A lot of bad software is effectively incoherent, so it
| can't be understood _as machinery_. Instead it has to be
| understood in psychological, historical, or archaeological
| terms. "Well back then they were trying to achieve X, and
| the programmer doing it was not very experienced and was
| really interested in trendy approach Y so he tried using
| library Z, but it wasn't really suited for the problem at
| hand, so he misused it pretty severely."
|
| That can be interesting, but it's often much more efficient
| to say, "Who cares how or why this got to be such a tangled
| mess. Let's solve for the actual current needs."
| jerf wrote:
| "But I think a better option is often fiddling and seeing
| what happens."
|
| If you're safely fiddling with it, I would consider that
| part of the process of understanding. I'm particularly
| prioritizing understanding what is actually doing.
| Historical context is primarily useful because it will
| point you in the direction of what else you may need to
| look at; when I fail to realize that removing X broke Y
| it's because I didn't realize that there's a reason those
| are together.
| wpietri wrote:
| I agree, but what I'm talking about is distinct from a
| usual "process of understanding", because the goal is
| explicitly remain as ignorant as possible. In many cases
| I want to learn the exact minimum needed to safely make a
| change. What were they thinking? What motivated them?
| Don't know, don't care. I just want to clean up the mess
| and move on to something actually useful and pleasant.
|
| As a practical example, last year I was supposed to
| figure out why a data collection system was not getting
| all the data we wanted. The person who worked on it was
| long gone, so I looked at the code. It was a bunch of
| stuff using Apache Beam. No tests, no docs. The original
| author was not a very experienced programmer. It jumbled
| together a variety of concerns. And after a day of trying
| to understand, it became obvious to me that some of the
| uses of Beam were unconventional. Plus Beam itself is its
| own little world.
|
| The next day, I said "fuck that", and wrote a very simple
| Python requests-based collector. I pretty quickly had
| something that was both much simpler and much more
| effective at actually getting the data. And from there I
| went into the usual sort of feedback-driven discovery
| process to figure out what the current users actually
| needed, with zero regard for original intent of the
| system was in solving problems for people no longer
| present.
|
| What was the thing doing? Why did it to it? How did it
| end up that way? All excellent mysteries that will remain
| mysteries, as I eventually deleted all the Beam-related
| code and removed its scheduled jobs. For me, this
| ignorance was truly bliss. And for others too in that the
| users got their needs solved with less work, and that
| developers had something much cleaner and clearer to work
| with in the future.
| marcosdumay wrote:
| > But I think a better option is often fiddling and
| seeing what happens.
|
| Yeah, as always, IMMV.
|
| But I do agree that online discourse puts too much
| emphasis on statically analyzing systems, and too little
| on adding instrumentation or just breaking it and seeing
| what happens.
|
| At the same time, my experience is that on practice
| people put too much emphasis on instrumentation or just
| breaking it and seeing what happens, and way too little
| on statically analyzing the system.
| jefftk wrote:
| _> But I think a better option is often fiddling and
| seeing what happens. The trick is to make it so that
| fiddling is safe. E.g., on a project where I have good
| test coverage and find mystery code, I can just delete it
| and see what fails. Or I set up a big smoke test that
| runs a bunch of input and compares outputs to see what
| changes._
|
| There was a good discussion of this in the comments,
| starting at https://www.jefftk.com/p/accidentally-load-
| bearing#fb-109168...
|
| In addition to tests, you can also add logging to your
| running system, or make the change behind a flag that you
| A/B test in production.
| bombcar wrote:
| The problem "fiddle and see if Rome burns" is that you
| may have broken something that only runs once a
| year/decade and you won't know if that process isn't in
| the list of tests.
|
| And by the time it breaks, will anyone remember the
| probable cause?
| cratermoon wrote:
| This could be considered a variant of Hyrum's Law: "With a
| sufficient number of users of an API, it does not matter what you
| promise in the contract: all observable behaviors of your system
| will be depended on by somebody". At some point the stud was
| became a structural member, because other changes made it so. Now
| the second floor depends on it, and removing it would compromise
| the structural integrity of the second floor.
| [deleted]
| wellpast wrote:
| What I've learned from decades of software development: ANY and
| every component or capability you build into your system,
| incidentally or explicitly, will immediately (ie _tomorrow_ )
| become "Accidentally Load Bearing".
|
| Dependencies flow in and onto new components like water. This is
| a fundamental law.
|
| Even secret interfaces, etc that you think no one could find or
| touch will be found and fondled and depended upon.
|
| This is why the correct view is that all software is a liability
| and we should write as little of it as possible, just the minimal
| that is needed to get the dollars and nothing more.
| ajuc wrote:
| This is why comments in the code aren't that useful, and why
| commit messages are essential.
| w10-1 wrote:
| This article and every other comment seems to miss the real
| issue: the lack of testing.
|
| Software differs from all other means of production in that we
| can in fact test any change we make before realizing it in the
| world.
|
| With good tests, I don't care what the intent was, or whether
| this feature has grown new uses or or new users. I "fix" it and
| run the tests, and they indicate whether the fix is good.
|
| With good tests, there's no need for software archeology, the
| grizzled old veteran who knows every crack, the new wunderkind
| who can model complex systems in her brain, the comprehensive
| requirements documentation, or the tentative deploy systems that
| force user sub-populations to act as lab rats.
|
| Indeed, with good tests, I could randomly change the system and
| stop when I get improvements (exactly how Google reports AI
| "developed" improvements to sorting).
|
| And yet, test developers are paid half or less, test departments
| are relatively small, QA is put on a fixed and limited schedule,
| and no tech hero ever rose up through QA. Because it's derivative
| and reactive?
| perrygeo wrote:
| test developers? test departments? QA teams? It's worth
| mentioning that the vast majority of software orgs don't have
| the luxury of such distinctions, i.e. software teams are
| generally directly responsible for the quality of their own
| work and can't punt problems across the org chart.
| hinkley wrote:
| Probably the most shocking revelation I've had in my time as a
| developer has been that testers are never paid the correct
| salary (some too high, most too low), and that if you have
| someone who is good at testing _and_ is becoming proficient at
| coding, their smartest move is not to become a FT developer,
| but to skip right over developing and go into security
| consulting. Instead of making 75% more money by switching
| careers, you can make 150% more.
|
| Software needs people with the suspicious minds of good
| testers, but security people make more money for the same
| skillset.
| jefftk wrote:
| _> With good tests, I don 't care what the intent was, or
| whether this feature has grown new uses or or new users. I
| "fix" it and run the tests, and they indicate whether the fix
| is good._
|
| Except when the tests verify what the code was designed to do,
| but other systems have grown dependencies on what the code
| actually does.
|
| Or when you're removing unused code and its associated tests,
| but it turns out the code is still used.
|
| Or when your change fails tests, but only because the tests are
| brittle so you fix the test to match the new situation. Except
| it turns out something had grown a dependency on the old
| behavior.
|
| Tests are great, and for sufficiently self contained systems
| they can be all you need. In larger systems, though, sometimes
| you also need telemetry and/or staged rollouts.
| fardo wrote:
| > the lack of testing
|
| Having worked on very long-running projects, testing or well-
| funded QA doesn't tend to save you from organizational issues.
|
| What typically seems to happen is tests rot, as tests often
| seem to have a shelf life. Eventually some subset of the tests
| start to die - usually because of some combination of
| dependency issues, API expectations changes, security updates,
| account and credential expirations, machine endpoint and state
| updates, and so on - and because the results from the test no
| longer indicate correctness of the program, and the marginal
| business value of fixing one individual broken test is
| typically very low, they often either get shut off entirely, or
| are "forced to pass" even if they ought to be an error.
|
| Repeat for a decade or two and there quickly start being "the
| tests we actually trust", and "the tests we're too busy to
| actually fix or clean up."
|
| Which tests are the good ones and bad ones quickly become
| tribal knowledge that gets lost with job and role changes, and
| at some point, the mass of "tests that are lying that they're
| working" and "tests we no longer care to figure out if they're
| telling the truth that they're failing" itself becomes
| accidentally load-bearing.
| joe_the_user wrote:
| _And yet, test developers are paid half or less, test
| departments are relatively small..._
|
| Huh? Your first part seemed to be repeating TDD optimism but
| then you switch test departments. Just make your claims
| consistent, I'd suggest you instead talk about tests being
| written by the programmers, kept with the code and
| automatically run with the build process.
|
| However, I don't think even TDD done right can replace good
| design and good practices. Notably, even very simple
| specifications can't be replaced by tests; if f(S) just
| specified to spit out a string concatenated with itself,
| there's not obvious test treating f as a black box that
| verifies that f is correct. Formal specifications matter, etc.
| You can spot check this but if the situation is one magic wrong
| value screws you in some way, then your test won't show this.
|
| _there 's no need for software archeology, the grizzled old
| veteran who knows every crack, the new wunderkind who can model
| complex systems in her brain, the comprehensive requirements
| documentation, or the tentative deploy systems that force user
| sub-populations to act as lab rats._
|
| Wow, sure, all that stuff can be parodied but it's all a
| response to software being hard. And software is hard, sorry.
| mucle6 wrote:
| Chesterton's Test
| hprotagonist wrote:
| reminds me of Hyrum's law a bit.
| kuchenbecker wrote:
| It is Hyrums law. The observable feature of the board was that
| it could bear load despite that not being the intention, and
| the house started using this observable feature.
| jefftk wrote:
| _> > Hyrum's law
|
| > It is Hyrums law._
|
| No, it's "Hyrum's" not "Hyrums": https://www.hyrumslaw.com/
| skitter wrote:
| Is this an instance of Cole's law: The fastest way to get
| the right answer is to post the wrong answer?
| pitaj wrote:
| Not sure if this is a joke or if you're actually that
| pedantic to think they purposefully left off the apostrophe
| because they think it's called "Hyrums law" not "Hyrum's
| law".
|
| They were agreeing with the top-level comment, not
| correcting their spelling.
| themillerdave wrote:
| I always refer to this as "Load-bearing wallpaper" - in so much
| that folks who see it, wouldn't think twice about tearing it down
| - it's wallpaper, right? Well, turns out it was load-bearing
| wallpaper and the house came down as a result.
| lambda wrote:
| My favorite "accidentally load bearing" artifact that I've found
| was a misconfigured sudo that would easily allow arbitrary code
| execution as root (it allowed passwordless sudo for a find
| command, which could be used with -exec), which a number of
| important support scripts for the product had been written to
| use. Load bearing privilege escalation!
| praptak wrote:
| Let the system go long enough and everything becomes accidentally
| load bearing. See also "implementation becomes the specification"
| - people will come to rely on every single undocumented
| implementation detail regardless of what the official spec says.
|
| That's why it is a good practice to have DiRT or similar
| exercises. Break things on purpose so that people don't rely on
| them when they shouldn't.
| gumby wrote:
| Evolution does this all the time, which is one of the myriad
| reasons biology is so hard.
|
| Really good, brief post.
| rkagerer wrote:
| Part of writing and maintaining good code is maintaining useful
| documentation (such as comments) expressing clear rationale and
| intent. Simple stuff can be elegantly implicit, and modern
| languages are getting better at capturing more of this in syntax
| and eliminating common footguns. But more complex systems tend to
| benefit from explicit explanation or even external design
| documents (like diagrams). A fix that doesn't keep those current
| isn't a completed fix.
|
| When I come in on a consulting basis I often have to help
| developers unwind the unintended effects of years of patches
| before we can safely make seemingly-simple changes. It's
| analysis-intensive, and like an archaeologist any artifacts I can
| dig up that you've left behind providing clues to what was in
| your head at the time can be helpful. In some cases where a set
| of functions is super critical we've made it part of the culture
| every time altered code is checked in to perform a walkthrough
| analysis to uncover any fresh unintended side-effects, ensure
| adherence to design requirements and discover and spotlight non-
| obvious relationships. The key is to turn the unintended or non-
| obvious into explicit. Sounds painful but in practice due to the
| high risk attached to getting that portion of code wrong the
| developers actually love that time for this is worked into the
| project schedules - it helps them build confidence the alteration
| is correct and safe.
|
| I wish it were easier to impress the importance of this on
| inexperienced developers without them having to go through the
| hell of maintaining code in an environment where it was lacking.
|
| It's a skill and art to keep the appropriate level of conciseness
| to avoid the documentation (no matter which form it takes)
| becoming too verbose or unwieldy to be helpful.
| Izkata wrote:
| > and like an archaeologist any artifacts I can dig up that
| you've left behind providing clues to what was in your head at
| the time can be helpful.
|
| This is why I'm against squashing commits in git, that our
| other development teams don't understand: you're going through
| extra effort to make it more difficult in the future.
| latchkey wrote:
| document the why, not the what.
|
| this is also why tests are so important. if you want to remove
| something, you have to think twice... once for the original
| code and once to fix the broken tests.
| regularfry wrote:
| That has saved me more times than I care to count. "Oh, _that
| 's_ why that code was there. I see."
| ochoseis wrote:
| One benefit software has over physical systems is that you can
| easily document it right inside the code with comments and types
| to make the intention clearer. This isn't foolproof, especially
| in dynamic languages like Python, but helps a lot.
|
| The analogy for the load bearing stud might be a hackathon
| project that never expected to see production. In reality, a lot
| of what we do is hack on something until it barely works, and
| move on to the next thing.
| MilStdJunkie wrote:
| Yuuuuuup. This precise set of problems is why Systems
| Engineering was adopted in Aerospace and Defense, because
| maintenance plans need to know what the "loads" are for each
| replaceable (spareable) unit or assembly.
|
| Today's SE has wandered far, far afield from original goals,
| tragically enough, but that was the original conception. One of
| the reasons for today's relatively toothless SE departments is
| the rise of finance into maintenance planning. Inventory
| depreciation is a cruel mistress, and "what gets spared" is
| rarely a SE judgement these days, at least in my experience.
| This has predictable results, but is partially offset by the
| exceptionally high bar for aerospace maintenance staff, who are
| generally pretty damn badass compared to, say, a washing
| machine repairman. Finance, naturally, would like to knock that
| bar down a few pegs, too.
| eschneider wrote:
| That's easy to do, if it's _intentional_. I'm always amazed at
| how often I see systems rate limited by some seemingly
| "decorative" upstream component, that when removed, causes
| everything else to run amok. :/
| oftenwrong wrote:
| The worst part is that it's typically harder to repair the
| "accidentally load bearing" change than it was to create it in
| the first place.
| orbital-decay wrote:
| Related concept from software engineering is "accidentally
| quadratic", which can manifest itself in the most unexpected
| places when two unrelated things collide.
|
| Both generalize to various forms of causal and failure analysis
| in systems design.
| hinkley wrote:
| I've been using, "that was a load bearing poster" for years.
| Usually right after a P1 and right before an RCA.
| joshka wrote:
| > This is a concept I've run into a lot when making changes to
| complex computer systems. It's useful to look back through the
| change history, read original design documents, and understand
| why a component was built the way it was. But you also need to
| look closely at how the component integrates into the system
| today, where it can easily have taken on additional roles.
|
| We're probably at a stage where doing this in an automated
| fashion might be reasonable. The context for why something works
| a particular way (say in some github repo) is the commit message
| and change detail, the PR, related issues, related chats in <chat
| tool of choice>, and then things temporally related to those.
| Feeding an LLM with the context and generating ADRs for an entire
| project automatically could be a feasible approach.
| squokko wrote:
| I've seen this SO many times. "We'll spin up this server that
| renders thumbnails of images for the UI."... months pass... "Hey
| why don't we use the thumbnail server to create low-res images
| for our marketing emails".... months pass... "The UI doesn't show
| thumbnails anymore so we can tear out the thumbnail server"
| OldGuyInTheClub wrote:
| Also the denouement to the Fawlty Towers "Builders" episode.
|
| https://www.youtube.com/watch?v=jfBOIbjbLv0
|
| (or, jump to https://youtu.be/jfBOIbjbLv0?t=1560)
| irisgrunn wrote:
| I had something similar. A couple of years ago I bought on old
| house. The previous owners did most of the work themselves from
| the 1960s on.
|
| The zinc gutter had leaked for probably decades and it destroyed
| part of the roof structure. The roof was held up by the wooden
| paneling the used to cover it on the inside (70s). So the wooden
| paneling was actually load bearing
|
| Actually I've found way more stuff in this house. For example at
| the end of the roof the tiles weren't wide enough and instead of
| buying extra roofing tiles, they decided to fill it with cement
| and pieces of ceramic flower pots.
| UncleEntity wrote:
| Yep, sounds like my garage.
|
| At first look it seem like someone backed into the garage door
| and mangled the hell out of it but on more careful inspection
| the roof is being barely held up by the tracks that the door
| runs in and is pretty near to giving up the ghost. Was just
| going to splice the ends of the rafters (like someone did on
| the other side who knows how many years ago...if it works, it
| works) and replace the garage door but now its looking like
| I'll need a whole new roof.
|
| What really worries me is the dodgy wiring strung all across
| the basement which is a combination of newish wires, old cloth
| covered wires and liberal applications of electrical tape to
| splice it all together. Luckily none of the wires seem to be
| load bearing...
| hinkley wrote:
| The thing I learned when we fixed our old house up for sale,
| is that in some municipalities you need a building permit to
| replace a floor that already exists with a new one. In our
| case water damage was from a claw foot tub drain, which I had
| fixed but years after the problem started, so it was in the
| middle of the floor. The contractor ripped it down to the
| joists and doubled them, which does not it turns out require
| a permit.
|
| Sounds like your guy had a similar experience.
| jedberg wrote:
| I had to do a garage roof a few years ago. The previous owner
| thought it would be a good idea to put a hole in the main
| crossbeam to attach the garage door opener. As soon as I
| bought the house I removed the garage door opener and put
| metal plates on both side of the hole bolted together.
|
| My "fix" held for about 11 years, but apparently it very
| slowly weakened, creating a small divot on the roof. Which
| got bigger and bigger with each rain, but since I never go on
| the garage roof, I didn't notice.
|
| Until during one heavy rain I got a surprise skylight!
|
| So yeah, you probably want to fix that before you get a total
| collapse like I did.
| bombcar wrote:
| Carefully reading the NEC indicates that loads of electrical
| tape is permitted way more often than you'd think it should
| ...
| hinkley wrote:
| If you go back to the early 1900s, the cladding was installed
| on a diagonal, which helped greatly in preventing the building
| from racking. Now we rely on sheet rock and plywood to provide
| that protection in earthquakes and wind storms.
|
| If you ever see a house stripped down to the sticks for a
| rebuild, you will hopefully notice a few braces added. Not to
| keep the walls from falling down, but to keep them square and
| true until the walls are rebuilt.
| jefftk wrote:
| For what it's worth, in the Boston area traditional sheathing
| is boards parallel to the ground, not diagonal.
|
| (I've seen dozens of houses from ~1900-1920 in the process of
| full gut rebuilds, and none of them had diagonally installed
| sheathing.)
| hinkley wrote:
| It might be more of a commercial building thing than a
| domestic construction one. I know I've seen it in a number
| of videos of renovations of larger buildings, including
| barns. I might have the time range off. Big cities are full
| of 1920's constructions especially on the West Coast, and
| they don't do that.
|
| My old house (~1920) had diagonal shiplap under the floors
| instead of plywood (but parallel in the oldest walls).
| That's probably more for making hardwood floors easier to
| install than structural integrity.
|
| Edit: The internet says 'start of the 20th century' phased
| out in 1950's (plywood), and 'sometimes diagonally'.
| jefftk wrote:
| The subfloors I've seen for old houses in Boston are also
| laid perpendicular to the joists, though diagonal does
| seem like it would make more sense.
| hinkley wrote:
| Laying a board over a seam in the subfloor sounds like a
| titanic pain in the ass. Diagonal means you might have to
| move the nail a little. Probably also limits the amount
| of dust and water that passes through from floor to
| ceiling.
| dmbche wrote:
| Degrees away from load bearing paint!
| hef19898 wrote:
| Or a poster!
| bcrosby95 wrote:
| I had a house that had really bad termite damage and the
| contractor called it "structural stucco".
| hinkley wrote:
| PSA: houses don't 'get termites'. They get water damage, and
| then the water damage gets termites.
|
| Most problems with houses come back to managing water, air,
| or some other infiltration. But mostly it's water.
| Simon_O_Rourke wrote:
| Good Gawd! A stud holding up a second floor by itself... time to
| have that domicile condemned and the inhabitants moved out asap!
| Cerium wrote:
| The only option is to do a complete rebuild. The load bearing
| stud indicates that the foundation design was inadequate for
| current needs.
| jefftk wrote:
| The closet partition stud was bearing enough load to matter,
| but it wasn't holding up the whole second floor by itself.
|
| I put in a new beam to replace the load bearing wall the
| preivous-previous owners had removed, with posts down to the
| basement: https://www.jefftk.com/p/bathroom-construction-
| framing
| geocrasher wrote:
| This reminds me of end users who unknowingly exploit a bug in a
| piece of software and integrate it into their normal workflow.
| The result is that when the bug is fixed, their workflow is
| interrupted, causing complaints.
| gerad wrote:
| https://xkcd.com/1172/
| Karellen wrote:
| More formally:
|
| > With a sufficient number of users of an API, it does not
| matter what you promise in the contract: all observable
| behaviors of your system will be depended on by somebody.
|
| https://www.hyrumslaw.com/
| [deleted]
| dudeinjapan wrote:
| I'm a believer in making a "Single Responsibility: ___" comment
| at the top of each class.
| marcosdumay wrote:
| If your class name doesn't answer it, that comment won't
| either.
| avgcorrection wrote:
| HN has such love for that early 20th century writer. So many
| seemed to have discovered The Fence at about the same time.
| dmbche wrote:
| The term load bearing always bring to my mind the breakdown of
| how the towers failed during 911 - especially how the plane
| cutting a lot of vertical steel beams redistributed the weight of
| the building onto other beams that were not rated to hold most of
| the buildings weight (while being heated) - they buckle and fail.
|
| Guess I'm thinking of being very aware of how the structure
| reacts to failure, and not necessarily the strenght of all
| individual parts.
| mcv wrote:
| I've definitely had this happen. With my own code, even. I build
| something complex, it's released to production, and a few months
| later I realise that something about it should be done in a
| different way, so I look at it, and other people have already
| built on top of the thing I wanted to change.
|
| On the other hand, if you can't figure out what something is for,
| sometimes the easiest way to find out is to remove it and see
| what breaks. Maybe that's not such a great idea for that load-
| bearing stud, but in software it's easy to undo.
| TheCapn wrote:
| Huh. Finally a name for it.
|
| I do a lot of support work for Control Systems. It isn't unheard
| to find a chunk of PLC code that treats some sort of physical
| equipment in a unique way that unintentionally creates problems.
| I like to parrot a line I heard elsewhere: "Every time Software
| is used to fix a [Electrical/Mechanical] problem, a Gremlin is
| born".
|
| But often enough when I find a root cause of a bug, or some sort
| of programmed limitation, the client wants removed. I always
| refuse until I can find out _why_ that code exists. Nobody puts
| code in there for no reason, so I need to know why we have a
| timer, or an override in the first place. Often the answer is the
| problem it was solving no longer exists, and that 's excellent,
| but for all the times where that code was put there to prevent
| something from happening and the client had a bunch of staff
| turnover, the original purpose is lost. Without documentation
| telling me why it was done that way I'm very cautious to
| immediately undo someone else's work.
|
| I suppose the other aspect is knowing that I trust my coworkers.
| They don't (typically) do something for no good reason. If it is
| in there, it is there for a purpose and I must trust my coworkers
| to have done their due diligence in the first place. If that
| trust breaks down then everything becomes more difficult to make
| decisions on.
| peteradio wrote:
| > "Every time Software to fix a [Electrical/Mechanical]
| problem, a Gremlin is born".
|
| I think I get the gist, but that sentence is missing some
| words.
| TheCapn wrote:
| oooboy is it. That's what I get for not proofreading.
| causi wrote:
| I'll never do PLC work again. Forget undocumented code, most of
| the time there's no schematics for the _hardware_ you 're
| working on because it was custom-built thirty years ago.
| TheCapn wrote:
| My company is _generally_ good about that. We have lots of
| overlapping documentation that answers questions like that in
| different ways. From Electrical schemas to QA docs, picture
| archives of panels and wiring, ticketing systems,
| spreadsheets over I /O, etc. etc.
|
| I hate PLC work for other reasons. I'm starting to look at
| going back to more traditional software role. I'm a bit tired
| of the road work and find the compensation for the amount
| asked of you to be drastically underwhelming. This meme is
| very much relevant:
|
| https://i.redd.it/rawo5uki1v9b1.jpg
| causi wrote:
| Ayep. When you're the PLC guy they expect you to know how
| to fix anything that plugs into a wall but isn't understood
| by the electricians.
| bamfly wrote:
| _This_ is why I comment a "why" for any line of code that's
| not _incredibly_ obvious. And 100% of the time when it 's due
| to interaction with something outside the codebase, whether
| that's an OS, filesystem, database, HTTP endpoint, hardware,
| whatever, if it's not some straightforward call to some API or
| library.
|
| Sleep due to rate limiting from another service? COMMENT. Who's
| requiring it, the limits if I know exactly what they are at the
| time (and noting that I do not and this is just an educated
| guess that seems to work, if not), what the system behavior
| might look like if it's exceeded (if I know). Using a database
| for something trivial the filesystem could plausibly do, but
| in-fact cannot for very good reasons (say, your only ergonomic
| way to access the FS the way that you need to, in that
| environment, results in resource exhaustion via runaway
| syscalls under load)? Comment. Workaround for a bug in some
| widely-used library that Ubuntu inexplicably refuses to fix in
| their LTS release? Comment. That kind of thing.
|
| I have written so very many "yes, I know this sucks, but here's
| why..." comments.
|
| I also do it when I write code that I know won't do well at
| larger scale, but can't be bothered to make it more scalable
| just then, and it doesn't need to be under current expectations
| (which, 99% of the time, ends up being fine indefinitely). But
| that may be more about protecting my ego. :-) "Yes, I know this
| is reading the whole file into memory, but since this is just a
| batch-job program with an infrequent and predictable invocation
| and this file is expected to be smallish... whatever. If you're
| running out of memory, maybe start debugging here. If you're
| turning this into something invoked on-demand, maybe rewrite
| this." At least they know I knew it'd break, LOL.
| MrBuddyCasino wrote:
| You're doing the lords work. I often get pushback on doing
| this with some variation of "comments bad, code should be
| self-documenting". This is unwise, because there are "what
| code does" and "why code does" comments, but this turns out
| to be to nuanced to battle the meme.
| mostlylurks wrote:
| Self-documenting code is perfectly capable of expressing
| the "why" in addition to the "what". It's just that often
| the extra effort and/or complexity required to express the
| "why" through code is not worth it when a simple comment
| would suffice.
| tetha wrote:
| > Self-documenting code is perfectly capable of
| expressing the "why" in addition to the "what".
|
| I don't think anymore that's true, at least in a number
| of areas.
|
| In another life, I've worked on concurrent data
| structures in java and/or lock-free java code I'd at this
| point call too arcane to ever write. The code ended up
| looking deceptively simple and it was the correct,
| minimal set of code to write. I don't see any way to
| express the correctness reasoning for these parts of code
| in code.
|
| And now I'm dealing with configuration management. Code
| managing applications and systems. Some of these
| applications just resist any obvious or intuitive
| approach, and some others exhibit destructive or
| catastrophic behavior if approached with an intuitive
| approach. Again, how to do this in code? The working code
| is the smallest, most robust set of code I can setup to
| work around the madness. But why this is the least
| horrible way to approach this, I cannot express that in
| code. I can express this in comments.
| sedev wrote:
| Concurrence: the ability of the code to be self-documenting
| ends at the borders of the code itself. Factors outside of
| the code that impose requirements on the code must be
| documented more conventionally. The "sleep 10 seconds to
| (hopefully) ensure that a file has finished downloading"
| anecdote from upthread is a great example.
| derefr wrote:
| "Why" isn't a property of the code itself, though; it's
| rather a property of the process of creating the code.
|
| Because of this, my personal belief is that the
| justification for any line of code belongs in the SCM
| commit message that introduced the code. `git blame`
| _should_ ultimately take you to a clear, stand-alone
| explanation of "why" -- one that, as a bonus, can be much
| longer than would be tolerated inline in the code itself.
|
| Of course, I'm probably pretty unusual, in that I
| frequently write paragraphs of commit message for single-
| line changes if they're sufficiently non-obvious; and I
| also believe that the best way to get to know a codebase
| isn't to look at it in its current gestalt form, but rather
| to read its commit history forward from the beginning. (And
| that if other programmers also did that, maybe we'd all
| write better commit messages, for our collective future
| selves.)
| ericbarrett wrote:
| Completely agree. I find this attitude toward (against?)
| comments is common in fields where code churn is the norm
| and time spent at a company rarely exceeds a year or two.
| When you have to work on something that lasts more than a
| few seasons, or are providing an API, comments are _gold_.
| csours wrote:
| There was some inscrutable code that had sleep 10 [seconds]
| in the middle.
|
| It took several hours to figure it out, but the sleep was
| there in case a file had not finished downloading
| eschneider wrote:
| _shudder_
| overnight5349 wrote:
| Hah, I did one of these just last week. There's some sort of
| silicon bug or incorrect documentation that causes this
| lithium battery charger to read the charge current at half of
| what it should be. This could cause the battery to literally
| explode, so I left a big comment with lots of warnings
| explaining why I'm sending "incorrect" config values to the
| charge controller.
|
| It's absolutely imperative that the next guy knows what the
| fuck I'm doing by tampering with safety limits.
| gav wrote:
| I like to make sure the "why" is documented, but it's hard to
| get people to care about that.
|
| I remember a former client tracking me down to ask about a
| bug that they had struggled to fix for months. There was a
| comment that I'd left 10 years earlier saying that while the
| logic was confusing, there was a good reason it was like
| that. Another developer had come along and commented out the
| line of code, leaving a comment saying that it was confusing!
| mike_hock wrote:
| The last part is also useful. Tells the next person where to
| look when they do run into scaling issues, and also tells
| them that there wasn't some other reason to do it.
| letitbeirie wrote:
| The most haunting comment line I've ever seen was buried deep
| in an Allen Bradley PLC:
|
| > I don't know why this rung is needed but delete it and see
| what happens for yourself
|
| Did not fuck around; did not find out.
| sumtechguy wrote:
| but now its like the number of licks to the center of tootsie
| pop the world may never know!
| praptak wrote:
| This has the "more magic" anecdote feel to it.
|
| http://www.catb.org/jargon/html/magic-story.html
| w0mbat wrote:
| I remember reading a story like this from the early days of
| Acorn. The first production sample of the BBC Micro came
| in, and would crash unexpectedly. Trial and error found
| that connecting a jumper wire between 2 particular points
| on the board stopped it crashing, but nobody could work out
| why it crashed or how that fixed it. They never worked it
| out and ended up shipping mass quantities of the BBC Micro
| with the magic jumper wire in place on each one.
| weaksauce wrote:
| do you remember what the instruction was?
| mauvehaus wrote:
| Context for those who haven't worked in the field: A PLC is a
| programmable logic controller. They are typically programmed
| with ladder logic which grew out of discrete relay based
| control systems.
|
| Generally they're controlling industrial equipment of some
| sort, and making changes without a thorough understanding of
| what's happening now and how your change will affect the
| equipment and process is frowned upon.
|
| https://en.wikipedia.org/wiki/Ladder_logic
| mhink wrote:
| I interned briefly at a company which mainly built
| industrial control systems. One of its most interesting
| features (which is also very mind-bending if you're coming
| from any sort of typical programming ecosystem) is that
| every "rung" is evaluated in parallel. (As a physical
| relay-based control system would have back in the day.)
|
| Very wild stuff.
| HeyLaughingBoy wrote:
| > "Every time Software is used to fix a [Electrical/Mechanical]
| problem, a Gremlin is born".
|
| Just did one of those this morning. Hmmm.
| smallpipe wrote:
| > I suppose the other aspect is knowing that I trust my
| coworkers. They don't (typically) do something for no good
| reason
|
| This so much. Depending on the git blame, I'll either remove it
| blindly or actually think about it way more.
| Karellen wrote:
| > But often enough when I find a root cause of a bug, or some
| sort of programmed limitation, the client wants removed. I
| always refuse until I can find out why that code exists. Nobody
| puts code in there for no reason, so I need to know why we have
| a timer, or an override in the first place.
|
| Isn't that just the regular Chesterton's Fence argument though?
|
| The one the article is specifically written to point out _is
| not enough_ by itself, because you need to know what else has
| been built with the assumption that that code is there?
| TheCapn wrote:
| All my comment is adding a software anecdote to the story. It
| really is just regular Chesterton's Fence, a term I've never
| heard until now but dealt with for the last several years.
|
| You're not wrong, but in the context of a PLC controlling a
| motor or gate it is far more segregated than the code you're
| probably thinking of. Having a timer override on a single
| gate's position limit sensor would have no effect on a
| separate sensor/gate/motor.
|
| If the gate's _function block_ had specific code built into
| it that affected _all_ gates then what you 're talking about
| would be more applicable.
| bombcar wrote:
| I think they're thinking of things like that software
| control for the health machine that could get in a state
| where it would give a lethal dose to a patient.
| [deleted]
| cortesoft wrote:
| This sounds more like the original Chesterton's fence than what
| the article is describing. The article is about understanding
| something's actual current purpose, rather than just the
| intended purpose.
|
| What the article is describing reminds me of the XKCD comic
| workflow: https://xkcd.com/1172/
|
| A system exists external to the creators original purpose, and
| can take on purposes that were never intended but naturally
| evolve. It isn't enough to say "well that is not in the spec",
| because that doesn't change reality.
| ke88y wrote:
| _> I do a lot of support work for Control Systems. It isn 't
| unheard to find a chunk of PLC code that treats some sort of
| physical equipment in a unique way that unintentionally creates
| problems. I like to parrot a line I heard elsewhere: "Every
| time Software to fix a [Electrical/Mechanical] problem, a
| Gremlin is born"._
|
| At least some of this is cultural. EEs and MEs have
| historically viewed software less seriously than electrical and
| mechanical systems. As a result, engineering cultures dominated
| by EEs/MEs tend to produce shit code. Inexcusably incompetent
| software engineering remains common among ostensibly
| Professional Engineers.
| TheCapn wrote:
| You're not wrong. It shows in the state of PLC/HMI
| Development tools. Even simple things like Revision Control
| is decades behind in some cases.
|
| I've basically found my niche in the industry as a Software
| Engineer though I can't say I see myself staying in the
| industry much longer. The amount of time's I've gotten my
| hands on code published by my EE coworkers only to rewrite it
| to work 10x faster at half the size with less bugs? Yikes.
| HMI/PLC work is almost like working in C++ at times, there's
| so many potential pitfalls for people that don't really
| understand the entire system, but the mentality by EE/ME
| types in the industry is to treat the software as a second
| class citizen.
|
| Even the clients treat their IT/OT systems that way. A
| production mill has super strict service intervals with very
| defined procedures to make sure there is _NO_ downtime to
| production. But get the very same management team to build a
| redundant SCADA server? Or even have them schedule regular
| reboots? God no.
| dmvdoug wrote:
| I have no clue, but I wonder how unique this attitude turns
| out to be among MEs/EEs versus, say, everyone dealing with
| electronics. Because the stories and complaints about
| mechanical and electrical engineers treating code (and
| programmers) as second-class, remind me very much of how
| front-end people complain about how they're perceived by
| back-end people. And about how backend people complain
| about how they're perceived by systems programming people.
| And so on up/down the line(s) of abstraction.
| weaksauce wrote:
| > It shows in the state of PLC/HMI Development tools.
|
| i mean you are talking about upgrading things that are
| going to be in service for decades perhaps. the
| requirements for the programs is generally not complicated.
| turn on a pump for a time, weigh something and then alarm
| if some sensor doesn't see something.
|
| Structured text was an improvement over ladder logic as you
| could fit more of the particular program in the screen real
| estate you had and could edit it easier since it was just
| text. though, that had its own set of issues that needed to
| be worked through and it wasn't a panacea.
| liminalsunset wrote:
| I think one of the reasons I've seen this happen is because
| typically, EE and ME programs in university teach very little
| CS "enough to be dangerous", and the few coding projects you
| are required to do are often taught in a way that downplays
| the importance of the software. Software is often seen as
| simply a translation or manifestation of a classical
| mathematical model or control system ( or even directly
| generated by Matlab/Simulink).
|
| Software, being less familiar, is not viewed as a fundamental
| architectural component because there often isn't sufficient
| understanding of the structure or nuance involved in building
| it. In my experiences software or firmware engineers tend to
| be isolated from the people who designed the physical
| systems, and a lot of meaning is lost between the two teams
| because the software side does not understand the limitations
| and principles of the hardware and the hardware team does not
| understand the capabilities and limitations of the software.
| ke88y wrote:
| The worst part is there's no particular reason for this --
| infusing proper software development best practices into
| existing EE/ME coursework isn't that hard.
|
| It's an instance of the larger pattern in which technical
| degree programs lag industry requirements by decades, as
| older faculty ossify at the state of the art circa 2-3
| years prior to when they received tenure.
|
| IMO one way to help would be to get rid of the entire
| notion of a "Professor".
|
| Instead, courses should be taught primarily by a
| combination of professional instructors on permanent
| contracts and teacher-practitioners supported by the
| instructors. The instructors should have occasional
| sabbaticals for the professional instructors to embed in
| firms and ensure they're up to date on the industry.
|
| The research side of the university can even more easily
| replace Professors and tenure with first-line lab managers
| on 3-5 year contracts whose job is simply to apply for
| grants and run labs, and who can teach if they want but are
| held to the same standards as any other applicant for an ad
| junct teaching position in any particular term.
| liminalsunset wrote:
| I definitely think there are two sides to this. The
| school I went to had a lot of professors for whom the
| "ossified 2 years prior to tenure" thing was true for,
| but I also found them to be helpful for teaching
| fundamental concepts that didn't change in an effective
| way.
|
| I think one barrier to better engineering programs in
| universities is that there typically is an onerous set of
| "accreditation requirements" which prevents significant
| modification of the curriculum to adapt to modern needs.
|
| The other barrier is that students culturally appear to
| not always want to do more coding than needed. Courses
| involving coding were widely regarded as the most
| difficult by the people around me, despite something like
| up to 80% of an EE class going into SW engineering after
| graduating.
|
| I think in general, degree programs are designed to be
| something that they're not used for anymore often. The
| usual line is that they're designed to provide a track to
| academia, and aren't vocational training. But nowadays
| degrees seem very ritualistic and ornamental - it seems
| that people are doing their learning on the job mostly
| whatever they do, and the relevance of the degree itself
| is just a shibboleth of some sort.
| 0xffff2 wrote:
| > I think one barrier to better engineering programs in
| universities is that there typically is an onerous set of
| "accreditation requirements" which prevents significant
| modification of the curriculum to adapt to modern needs.
|
| This seems to be rapidly dissolving, at least in
| California. Several schools including Stanford, Cal Tech,
| and several of the UCs have dropped ABET accreditation
| for most of their programs in recent years, with more
| likely to follow as they come up for renewal.
| overnight5349 wrote:
| Why should EEs _also_ be software engineers? These are two
| distinct specializations.
|
| No sane person would expect a programmer to just design a
| lithium battery charge circuit that goes in your user's
| pocket, that'd be reckless and dangerous. I likewise would
| never expect a programmer to break out an oscilloscope to
| debug a clock glitch, or characterize a power supply, or
| debug protocol communication one bit at a time. I wouldn't
| ask a programmer to do FCC pre-validation, or to even know
| what that means.
|
| Why then do you want to rely on an EE to produce critical
| software?
|
| As an EE, I know my limits and how to separate concerns. I
| keep my bad C++ restricted to firmware and I simply do not
| write code further up the stack. We have programmers for
| that. Where the app needs to talk to the device, I'll write
| an _example_ implementation, document it, and pass it off
| to the programmer in charge. It 's their job to write good
| code, my job is to keep the product from catching fire.
|
| If you want good code, hire a programmer. If you want
| pretty firmware, hire a programmer to work with your EEs.
| If you expect an EE to write code, you get EE code because
| their specialization is in _electronics_.
|
| Unless you _really_ want an EE who is also a software
| engineer, but then you 're paying someone very highly
| skilled to do two jobs at once.
|
| Electronics and software are two different jobs requiring
| two differently specialized people. It just looks like they
| overlap.
| bee_rider wrote:
| I think it is the result of how these things tend to be
| taught. At least in my school, all the EE's and all the
| computer engineering students had the same first couple
| programming classes.
|
| Lots of EE's need to do some programming, and lots of
| people getting EE degrees end up in programming careers,
| so it would be a disservice not to teach them any
| programming at all. In particular, an engineer should be
| taught enough programming to put together a matlab or
| Numpy program, right?
|
| Meanwhile, some of their classmates will go on to program
| microcontrollers as their job.
|
| Writing programs and a product, and writing programs to
| help design a product, are two basically different types
| of jobs that happen to use similar tools, so it isn't
| that surprising that people mix them up.
| hef19898 wrote:
| On the other hand there was Juicero...
| ke88y wrote:
| I don't follow. Did you accidentally reply to the wrong
| comment?
| hef19898 wrote:
| No, why? The point was EEs and MEs, or rather traditional
| engineering heavy culture produces bad software (never
| mind the first software devs tended to be EEs), so
| Juicero is good example of a software-leaning culture
| producing shitty hardware products.
| overnight5349 wrote:
| Uh, the Juicero was _spectacular_ hardware. The
| mechanical engineering in that beast was absolutely
| beautiful.
|
| I don't recall what the software was like, but none of
| that is why it failed, it was simply a moronic business
| idea. An overpriced subscription for low quality fruit in
| a DRM-laden pouch. Nobody wanted it then or now.
| sam_bristow wrote:
| I kinda want a Juicero now, but only as an object d'Art.
| It was a garbage product.
| [deleted]
| ndiddy wrote:
| The Juicero was terrible hardware in the sense that they
| could have made a product that was functionally similar
| but cost far less to make. It seems like they got a
| hardware engineering team straight out of college and
| gave them no constraints or budget. You have a giant
| CNC'd aluminum frame, a custom gearbox, a custom power
| supply, a custom drive motor, etc. All of this is only
| necessary because they decided to squeeze the juice out
| of the bags by applying thousands of pounds of force to
| the entire surface of the bag at once vs. using a roller
| or something. They were likely losing hundreds of dollars
| per unit even when they were selling the press for $600.
| Izkata wrote:
| > "Every time Software is used to fix a [Electrical/Mechanical]
| problem, a Gremlin is born"
|
| Gizmo caca.
|
| (...I just watched both Gremlins movies last weekend...)
| hinkley wrote:
| > Nobody puts code in there for no reason, so I need to know
| why we have a timer, or an override in the first place.
|
| I would like to think that if I sent out an email about git
| hygiene that you would support me against the people who don't
| understand why I get grumpy at them for commits that are fifty
| times as long as the commit message, and mix four concerns two
| of which aren't mentioned at all.
|
| Git history is useless until you need it, and then it's
| priceless.
|
| I can't always tell what I meant by a block of code I wrote two
| years ago, let alone what you meant by one you wrote five years
| ago.
| xen2xen1 wrote:
| _cough_ 737 Max _cough_
| alex-robbins wrote:
| > "Every time Software is used to fix a [Electrical/Mechanical]
| problem, a Gremlin is born"
|
| I'm definitely going to use this, and I think there's a more
| general statement: "Every time software is used to fix a
| problem in a lower layer (which may also be software), a
| gremlin is born."
| glonq wrote:
| > "Every time Software is used to fix a [Electrical/Mechanical]
| problem, a Gremlin is born"
|
| Early in my career, I was confused by seemingly-crazy questions
| in the Hacker Test (https://www-
| users.york.ac.uk/~ss44/joke/hacker.htm) like...
|
| > 0133 Ever fix a hardware problem in software?
|
| > 0134 ... Vice versa?
|
| But after spending years developing embedded systems, I don't
| even blink at such questions. _Yes, of course I have committed
| such necessarily evils!_
| throw9away6 wrote:
| Sometimes you have to remove the chunk and see what breaks
| because the person that put it in is long gone and
| documentation is missing
| Waterluvian wrote:
| On the topic of load bearing studs. Is there some way to test for
| that? How to tell non-destructively how much compression one is
| under?
| csours wrote:
| See also "Swiss Cheese Accident Model" and Melted Cheese Accident
| Model. Also see also Stockton Rush's statements on safety. He
| said that most accidents are caused by operator error, so making
| the sub strong enough wouldn't affect safety.
| marcosdumay wrote:
| What is that molten cheese accident model? Are you trying to
| describe deviance normalization?
| csours wrote:
| Molten cheese means that something that was intended to
| increase safety became a hazard during an incident.
|
| Think of how the SCRAM at Pripyat/Chernobyl caused the
| reactor to go supercritical because of the graphite tips. The
| control rods should have reduced reactivity in the reactor,
| but the first section of the rod increased reactivity.
|
| Or how a hard hat dropped from a height may cause injury.
| hinkley wrote:
| > Figuring out something's designed purpose can be helpful in
| evaluating changes, but a risk is that it puts you in a frame of
| mind where what matters is the role the original builders
| intended.
|
| One of the biggest challenges I find in
| refactoring/rearchitecting is getting people to separate why
| something was done from whether it still needs to exist.
|
| Too many times someone has insisted that a weird piece of code
| needs to exist because we never would have shipped without it.
| They treat every piece of the structure as intrinsic, and can't
| conceive of any part of it being scaffolding, which can now be
| removed to replace with something more elegant and just as
| functional.
|
| When you put a doorway through a loadbearing wall, contractors
| and smart people place a temporary jack to brace the wall until a
| lintel can be substituted for the missing vertical members. Some
| developers behave as if the jack is now a permanent fixture, and
| I have many theories why but don't know which ones are the real
| reasons.
___________________________________________________________________
(page generated 2023-07-20 23:01 UTC)