|
| sovietswag wrote:
| > oh well, grug end up at good company anyway and rob pike dress
| habit increasingly erratic, so all work out in end, but point
| stand: logging very important!
|
| beautiful...well done....
| twhitmore wrote:
| Microservices
|
| grug wonder why big brain take hardest problem, factoring system
| correctly, and introduce network call too
|
| That made me laugh. The microservices madness of the past decade
| is now starting to settle down to more mature understandings, but
| there are still a lot people biting off large testing,
| operational, and data transactionality/ reporting costs.
|
| People often don't recognise beforehand the magnitude of extra
| complexity & associated productivity costs.
|
| I've seen companies architecting 50 microservices with 50
| separate datastores when they actually needed 5 midi services..
| Then lose half their productivity trying to work with all this.
| strix_varius wrote:
| I don't know if this is universal, but in my circles
| "microfrontends" are now all the rage.
|
| How do you bring up concerns with that in good faith? It's so
| obviously terrible that I've no idea where to begin.
| charlie0 wrote:
| Never before have I read such wisdom. Young grug impressed.
| whiddershins wrote:
| > Microservices
|
| grug wonder why big brain take hardest problem, factoring system
| correctly, and introduce network call too
|
| seem very confusing to grug
|
| >
|
| Yes.
| tharax wrote:
| This is perhaps the most succinct way I've ever seen this
| expressed. Agree 100%.
| tines wrote:
| As a grug-brained developer, I love the spirit of this, but it's
| kinda hard to read. Maybe the author can publish an English
| translation? :)
| crooked-v wrote:
| On the other hand, I'd be interested in seeing a 'ten hundred
| most common words' version of it that dumps those complicated
| words like 'refactor'.
| bitwize wrote:
| This reminds me rather of a cross between "Code Monkey"
| (Jonathan Coulton song) and Film Crit Hulk Smash.
| egypturnash wrote:
| BE THANKFUL GRUG NO TYPE IN ALL CAPS LIKE FILM CRIT HULK,
| FILM CRIT HULK HAVE MANY THOUGHTFUL POINTS TO RAISE ABOUT
| FILMS SND STORIES BUT ALSO READING ALL CAPS FOR MORE THAN
| ABOUT ONE PARAGRAPH IS OUCHY
|
| (Film Crit Hulk released a book; half of it was in all caps,
| the other half was the exact same text except in normal
| sentence case.)
| andrepd wrote:
| grug think grugposting is part of the charm
| layer8 wrote:
| Grug thinks there would be middle course keeping most of
| charm but less exhausting to read.
| manmal wrote:
| Exhausting make grug read more slowly and parse well.
| raphlinus wrote:
| I might be willing to give this a shot. I appreciated the charm
| and humor in the original, but especially for readers who don't
| have English as a first language it probably gets in the way of
| the message.
| jstanley wrote:
| > grug no able see complexity demon, but grug sense its presence
| in code base
|
| This is the key problem with complexity.
|
| Complexity is fine if you understand it! It's when you're aware
| that something is complex, but you start to get these mental
| force-fields pushing you aware from the scary parts, that it
| becomes a problem.
|
| > demon complexity spirit mocking him make change here break
| unrelated thing there what!?!
|
| That's the happy case! The sad case is when you make a change and
| don't observe any obvious breakage, but then 3 years later you
| realise something you somewhat care about has been silently
| broken for a very long time.
| bekantan wrote:
| > grug very like type systems make programming easier. for grug,
| type systems most value when grug hit dot on keyboard and list of
| things grug can do pop up magic. this 90% of value of type system
| or more to grug
|
| This resonates with me
| LawnGnome wrote:
| Australians of a certain age might have a different (yet not that
| different) take on the Grug brain:
| https://www.simonandschuster.ca/books/Grug/Ted-Prior/9780731...
| bpicolo wrote:
| Grug and I have essentially identical software development
| philosophies. I appreciate you Grug. This, especially, was where
| I felt kindred spirits colliding.
|
| > type systems most value when grug hit dot on keyboard and list
| of things grug can do pop up magic
| strix_varius wrote:
| For me, that's 50% of it. The other 50% would be:
|
| > type systems other most value when grug make wrong, but no
| user see because big red arrow point to first.
| kazinator wrote:
| This reads a lot like like commit comments, status reports,
| e-mails and tickets in a company in which everyone is from a
| different country from around the globe.
|
| If you can't read grug English, you will find it hard to navigate
| in the global workforce.
| girvo wrote:
| I have accidentally introduced "dope" as a thankful affirmative
| into our international developers lexicon at work. There's
| another even more amusing one too but I can't remember what it
| is. Working with global teams is fun!
| whiskeytuesday wrote:
| > grug understand all programmer platonists at some level wish
| music of spheres perfection in code. but danger is here, world is
| ugly and gronky many times and code so also must. humility not
| often come big brained or think big brained easily or grug even,
| but grug often find "oh, grug no like look of this, grug fix"
| lead many hours pain grug and no better or system worse even.
| grug early on often charge into code base waving club wildly and
| smash up everything, learn not good
|
| > grug not say no improve system ever, quite foolish, but
| recommend take time understand system first especially bigger
| system is and respected code working today even if not perfect
|
| grug read this and grok spirit, grug enlightened. master not club
| grug so much.
| Rantenki wrote:
| Grug state Chesterton's fence very easy understand way.
| odipar wrote:
| big brain really like post. lesson learn is deep!
|
| "(best grug brain able to herd multiple big brain in right
| direction and produce many complexity demon trap crystals, large
| shiney rock pile!)"
| tboyd47 wrote:
| The advice is fantastic! Fear the club.
|
| > grug tempted to reach for club and yell "big brain no maintain
| code! big brain move on next architecture committee leave code
| for grug deal with!"
|
| > grug tempted reach for club when too much agile talk happen but
| always stay calm
| beckingz wrote:
| Now we add GRUG to KISS and YAGNI.
| arthurcolle wrote:
| > test shaman have good point on importance of test, even if test
| shaman often sometimes not complete useful feature in life and
| talk only about test all time, deserve of club but heart in right
| place
|
| > also, test shaman often talk unit test very much, but grug not
| find so useful. grug experience that ideal tests are not unit
| test or either end-to-end test, but in-between test
|
| amazing
| bfung wrote:
| this grug read article, but author grug big brain, article too
| long. If article was smaller with less complexity, easier for
| regular grug to read and remember.
|
|
| whoomp12342 wrote:
| this is nothing short of amazing
| TranquilMarmot wrote:
| I think this nicely captures everything I've learned about
| programming over the past n years that I wish other people would
| realize too.
| eurasiantiger wrote:
| What have been the most complex business requirements for a
| project you have worked on, and what made them complex? Was the
| resulting system less complex than the requirements?
| resters wrote:
| I can't tell who this article is making fun of.
| arbenpurben wrote:
| This makes me so happy
| MrPatan wrote:
| "deserve of club but heart in right place"
|
| I love it.
| cubano wrote:
| The problem here as I currently see it.
|
| What could be complex to some could be simple to others.
|
| How could grug developer possibly make sense of such a
| contradictory statement?
|
| My name is Groot!
| planarhobbit wrote:
| Horseshoe theory right once again: Grug and 100x'er megaminds are
| aligned, and the midwits are over complicating and
| underperforming.
| phailhaus wrote:
| Love this. Always keep it simple, because future me is dumb. I
| will say though that frontend dev gets a bad rap, and the tooling
| is complex because the problem is. UI's are incredibly stateful
| by nature, and you're not going to get anywhere unless you use a
| mature framework that lets you reason about it effectively. No,
| I'm not talking about using React to make a static site, but
| anything with a modicum of complexity gets out of hand pretty
| quick.
| [deleted]
| elwell wrote:
| Basically "Simple Made Easy"
| maest wrote:
| > sometimes probably best just not tell project manager and do it
| 80/20 way. easier forgive than permission, project managers mind
| like butterfly at times overworked and dealing with many grugs.
|
| In my experience, I have to fight to keep my devs from over
| engineering their solutions and just get something going.
|
| I'd love to work with a dev who's happy to think about how to
| most quickly deliver value and who's willing to help with the
| cost-benefit analysis for each suggested feature.
|
| Problem is, for that, you need a developer who cares about and
| deeply understands the use case/the product. Many of the devs
| I've had to work with were more interested in building pristine
| codebases with clever abstractions and ability to scale to
| unnecessary numbers of users or bytes.
| TideAd wrote:
| Do you understand the basic reasons why?
|
| Developers are on the hook for bad code and complexity. Rushed
| code makes feature work take longer, it makes working more
| irritating, and creates operational work. Everyone is burned by
| a team that does these things poorly at some point in their
| career and it drains the life out of you.
|
| They need to trust that you'll schedule time to go back and do
| things correctly. Clean up technical debt, nail down all the
| requirements, etc.; you don't want to be jumping from MVP to
| MVP. Maybe you do this well, I don't know. But you need to
| understand the motivations and incentives of the devs you work
| with better or you're going to be fighting them constantly.
| devmunchies wrote:
| > Rushed code makes feature work take longer
|
| grug say nothing of "rushed code". Grug get sick if grug
| drinks from dirty water, even if it is closer than walking to
| clean water. Rushed code and dirty water hurts Grug.
|
| But that not mean that Grug needs to dig a trench to clean
| water, or build wall like beaver to get more clean water, it
| hurts Grug's back. Grug just walk to clean water when Grug is
| thirsty.
|
| Grug dig canal to clean water before, and Grug need to always
| keep canal clean and me not able to hunt for food because me
| digging new holes. One time, chief said village need to move
| to other side of mountain. Grug said goodbye to canal and my
| beaver wall. Grug should not built them.
| verve_rat wrote:
| 100% A bad code base is a mental health hazard, and that shit
| hurts. Of course time crunch isn't the only thing that makes
| a bad code base. Devs bike shedding to much, or just not
| being good at maintaining a code base can have the same
| effect, but not having the time to protect your own future
| mental health really starts to weigh on a workplace.
| ornornor wrote:
| You nailed it.
| riazrizvi wrote:
| The difference is mostly a result of perspective, that could be
| fixed. The PM has the use cases and product gestalt, if this
| was shared and made the environment in which the devs work,
| their prioritizing shifts to product, and engineering concerns
| would be limited to more obvious ones that make sense.
|
| But it's human nature to protect one's job and decision making
| autonomy. PMs being no exception, often underweight their roles
| in communication transfer and overweight them in decision
| taking.
| [deleted]
| goodoldneon wrote:
| It's a balance. As an engineer, I'm constantly dealing with the
| consequences of a "the feature worked so we shipped" mindset.
| Churning out features without thinking about architecture
| creates increasing amounts of code "tangle" that gradually
| slows down feature dev. On the flip side, thinking too much
| about architecture slows down feature dev
| galaxyLogic wrote:
| You have the right insight I think. The thing about putting
| lots of effort into "refactoring" is that the code you refactor
| may actually not end up in the product at all.
|
| I think "prototyping" is better than "refactoring". Prototyping
| basically means that you write your app more than once. On the
| 2nd round you know what needs to be there and what not. You may
| have come up with a much better much simpler design for the
| whole system when you know what needs to be there and what it
| needs to do.
|
| Code-quality is important no doubt, but it is not important for
| code that doesn't end up in the final product.
| lmarcos wrote:
| That's because such developers know that they won't have to
| maintain such code. They will probably be gone (switch to
| another company) in 1 or 2 years.
| jbreckmckye wrote:
| It's a question of incentives and accountability.
|
| PMs aren't accountable when their shortcuts come and bite the
| team further down the line. Developers feel the pain instead.
|
| PMs won't be honest with the business that they sold an
| undercooked product. Need to suddenly scale up that
| "pragmatically" designed database? I know in my heart that you
| will almost _never_ manage expectations with your superiors if
| you can harangue developers into overtime or death marches.
| "Who could have guessed this could happen?"
|
| Don't take that personally. It's just the way incentives are
| structured for middle managers. By the time the problems of
| your "pragmatic" architecture have emerged, your typical PM /
| EM / team lead will either be working on another team, doing
| another job, or talking about "tech debt" as "just one of these
| things", a mysterious natural force, visiting your team
| stochastically like a freak summer snowstorm or an outbreak of
| measles.
|
| _That_ is why developers are cautious. Do you _seriously_ think
| that you are the only person in your team who understands
| "commercials" or "cost benefit analyses"? Experienced
| developers do, which is why we've learned the best strategy in
| the long run is to avoid offering concessions to people without
| any skin in the game.
| xupybd wrote:
| I've been there, so far away from the business use of the
| product that my solutions focused on the tech.
|
| I'm sorry.
|
| Now I'm right on the front lines of the business and it's eye
| opening. I think we need to take time to tech the domain to
| devs first. It's expensive and won't pay off unless the dev
| stays on the project for a while but it's the only way to allow
| the dev to understand what they're trying to do for the
| business.
|
| In reflection I'm wondering if the problem is more that an
| external consultant is often not aligned with the business.
| Being directly employed helps with alignment.
| charlie0 wrote:
| The problem is that most companies don't proactively teach
| the business side to the devs, I know mine doesn't.
| galaxyLogic wrote:
| Nice article but a bit tedious to read improper English. It is
| fun for paragraph or two but wears out rather quickly. If you got
| something important to say why not just say it as clearly as
| possible?
| going_ham wrote:
| > good debugger worth weight in shiney rocks, in fact also more:
| when faced with bug grug would often trade all shiney rock and
| perhaps few children for good debugger and anyway debugger no
| weigh anything far as grug can tell
|
| grug know debugger good but grug often realize grug no need
| debugger on smaller cases and only run it when grug need it, grug
| try simple code like print and log first, if grug sad and no
| understand grug go for debugger
| dmix wrote:
| On the frontend I have a sweet debugger setup with neovim and
| chrome but there's definitely a time investment setting it up.
| The overhead exists almost entirely because of how the code
| goes through a Typescript, Vue/Vite transpiler and needs to
| sync with the source map... so breakpoints aren't a 1-to-1
| connection.
|
| So yeah console.logs are still quite common even if you have a
| great debugger because it's the most accessible and laziest
| option.
|
| But there's something very rewarding about getting really good
| with a debugger and figuring things out quickly.
| mattmanser wrote:
| Relying on log and print statements is like giving up. I would
| claim that's not simplicity, that's inexperience, but I have no
| idea what language you're referring to. Sometimes I do it with
| JavaScript when I didn't setup the project, it's using a
| framework I don't know and I'm not willing to spend the time
| figuring out how to get real debugging working so there are
| caveats.
|
| But you definitely should not be doing that if you have a good
| debugger as It's faster to click the line to add a break point
| and press play. You can SEE the state. And you can view other
| variables at the same time if something's looking whiffy,
| usually by just hovering your mouse. Plus see the entire call
| stack.
|
| The thing that's boggling my mind about this is that if you
| know the line to add a log statement on, you know the line to
| add a breakpoint on. It's so much easier to just add a
| breakpoint.
|
| In some languages if I saw someone adding a log statement while
| debugging I would immediately classify them as a junior
| programmer and start teaching them how to debug properly.
|
| Either you are using a shitty language with a crap debugger or
| you need to learn how to use your IDE.
| nwatson wrote:
| You can't run a system handling real money or real medical
| records in a debugger. Or if you are, you're violating a
| bunch compliance standards and will get sued into oblivion.
| going_ham wrote:
| It totally depends on the case at hand!
|
| I use debugger all the time when I run into pointer related
| issue, or some checking some tensors in deep neural nets etc.
|
| In some cases, I throw debugger just to see what is going on.
|
| However, I have had few cases where debugger slowed me down.
| If you are doing something in graphics that requires you
| debugging issues that spans multiple frames, sometimes it's
| easier to notice the value over a period of time and see why
| things are behaving that way. From there you can reason what
| might be causing the issue. It can be done frame per frame
| inserting multiple breakpoints, recording them and viewing
| them accordingly! However, I prefer simple logs in such
| cases.
|
| I have used both approaches as time demanded.
| iamthepieman wrote:
| If I set a breakpoint somewhere and it ended up being a
| location that was useful, that's usually a good place for a
| log statement.
|
| As for your point about logging being a fail condition, I was
| working on a distributed system where I had no control over
| which instance my code was running on. I would attach a
| debugger and make the same request a dozen times before the
| instance I had attached the debugger to processed the
| request. This wasn't a system I could setup a local instance
| of. I also couldn't reduce the instances to a single one
| because there were other devs, testers, data engineers
| working on it and the system did raster processing that
| regulary took 1-5 minutes. I resorted to log debugging.
| IsopropylMalbec wrote:
| You are not able to, or at least should not be able to debug
| your code in production. More than likely all you will have
| is your logs.
| nerdponx wrote:
| Printf bad, log good. Grug already have logging in app. Grug
| use logging, Grug no reinvent logging with printf.
| ath3nd wrote:
| This. Is. Pure. Gold!11
| jamal-kumar wrote:
| smol brain can dodge [1]
|
| [1]
| https://preview.redd.it/g1lpdmt1iiv51.jpg?auto=webp&s=a5f27c...
| 5cott0 wrote:
| sometime grugbrain sometime complexitybrain
| GrumpyNl wrote:
| That's a great write up.
| lxe wrote:
| Start calling bad abstraction "indirection". If I'm debugging
| something, I don't want to be chasing a rabbit through figuring
| out what calls what, and what constant is stored where, what
| pattern created what instance, etc...
| crooked-v wrote:
| I hated dependency injection until I escaped Javaland and
| discovered that you could do it with direct interface
| references instead of four layers of indirection.
| csours wrote:
| Even big brain developer is grug brain when read code later.
| sdfhdhjdw3 wrote:
| Too difficult to read, can't be bothered.
|
| Does this style really appeal to anyone at all?
| bigbillheck wrote:
| I didn't think reading it was very hard at all.
| tragomaskhalos wrote:
| Wise fellow, that grug.
| abecedarius wrote:
| cf. 'Grunk' in the very funny Lost Pig: https://pr-
| if.org/play/lostpig/
|
| I skipped most of this post, but the combo of name and writing
| style seems like a homage.
| dugmartin wrote:
| Grug no talk of estimation spirit demon.
| mcbishop wrote:
| that grug say many variables good. make this grug many happy.
| layer8 wrote:
| put explicit type on variable even more good for read code
| throwawayacc2 wrote:
| Grug no read good but grug fink is good advice here
| wly_cdgr wrote:
| This bats 0.950+
|
| Who is this person? They must be a very senior Jedi
| palotasb wrote:
| > grug not like big complex front end libraries everyone use
|
| > grug make htmx and hyperscript to avoid
|
| https://twitter.com/htmx_org/status/1539713592794169346
|
| https://github.com/bigskysoftware
| ntoskrnl wrote:
| His name is grug.
| philangist wrote:
| His name is Robert Grugson
| smm11 wrote:
| I sense a certain age-range here.
| recursive wrote:
| grug sense a certain age range in comment
| genjipress wrote:
| You've heard of Film Crit Hulk? Here's Software Dev Hulk.
| trwhite wrote:
| I have been thinking about the complexity bias that affects our
| perception of quality. I think as programmers it is our natural
| assumption that if something is complex, lots of thought must
| have gone into it beyond our understanding. This is especially
| true when starting a new job. But this is slightly ironic because
| often more code makes something slow, which isn't a good thing at
| all.
| dgb23 wrote:
| What a fun article!
|
| When reading it, I felt like it was loosely inspired by A
| Philosophy of Software Design by Ousterhout. And it was! Near the
| end it is listed as recommended reading. Cannot recommend it
| enough.
| pawelduda wrote:
| > grug has never used erlang, hear good things, but language look
| wierd to grug sorry
|
| maybe grug try drink elixir?
| nathias wrote:
| complexity isn't bad, redundant complexity is
| [deleted]
| dack wrote:
| As funny as this post is to read, I don't want to see yet another
| developer say "complexity bad". I want to see a company deliver
| high-quality products with very few bugs at a fast cadence, and
| continue to make major changes long into the future without
| slowing down.
|
| _THEN_ I want developers from that company to share their
| opinions about how they do it. Do such companies/products even
| exist? Software is so bad these days that maybe no existing
| software lives up to our ideals.
| dgb23 wrote:
| You mean in the form of books, tech talks, articles and so on?
| There's plenty of that. But it is usually very technical or
| about abstract problem solving, sometimes also
| historical/anecdotal. Things like that.
|
| Methodology stuff sometimes comes from people who don't seem to
| code much at all, or haven't for a long time. I don't really
| read those things often and when I do I tend to skim them out
| of boredom.
|
| Software design, architecture and paradigms are a mixed bag.
| There is plenty of distracting stuff there, and much is from
| people who again, don't code. But there are a bunch of rare
| gems in this area, even coming from academics/teachers or
| veterans who haven't been in the trenches for quite a while,
| but have plenty of useful things to say.
| l5ymep wrote:
| Complexity doesn't necessarily slow down feature development.
| In my experience it reduces the project longevity. At some
| point it will be too big and complex to rewrite all the while
| more glaring problems emerge and cannot be dealt with.
| [deleted]
| dusted wrote:
| Well meaning..
|
| However, what I _REALLY_ want is a sw-dev (let's just say it like
| it is _PROGRAMMER_) version of the BOFH stories.
| agentultra wrote:
| Ah, the ample club of wishful thinking.
|
| There are two general ways of approaching software design (and
| I'm paraphrasing Tony Hoare here):
|
| 1. You can write software so simple there are obviously no errors
|
| 2. You can write software so complex there are no obvious errors
|
| One thing that escapes "grug" is that achieving 1. often requires
| more sophistication than their magical club allows. Most well-
| intentioned "grug" developers will write software so simple that
| it becomes it's own form of complexity: a giant mud-ball of for-
| loops, while-loops, variable assignments, and other wonderful
| side effects. Instead of addressing complexity head-on with
| abstraction, "grug" will beat "galaxy brain" over the head.
|
| What grug fails to understand is that simplicity isn't easy or
| familiar. It doesn't mean "sticking to what you know." If often
| requires being able to reason about programs and to verify that
| reasoning!
|
| But go ahead grug... keep beating people over the head with the
| club and hope that the complexity will go away.
| keerthiko wrote:
| > a giant mud-ball of for-loops, while-loops, variable
| assignments, and other wonderful side effects.
|
| Woah woah. This is literally the kind of complexity grug wants
| to avoid. Simple doesn't mean using the fewest language
| features or keywords, it means simple to read, follow along,
| reason about, and debug. Abstractions can aid in that (like
| using a third party library!), until they are
| imported/implemented aspirationally and thus often
| unnecessarily, and sometimes resulting in abstractions for
| abstractions, selective application of the abstractions vs
| fresh implementation, etc (...and thus AWS)
|
| At no point does grug argue that you should stick to what you
| know, he just says you should trap your complexity in crystals
| ie literally suggesting to use the Good Abstractions, When They
| Make Sense.
| kazinator wrote:
| Software in category (1) and (2) can be of any relative size.
|
| 1 could be 50,000 lines, 2 could be 500.
| coldtea wrote:
| > _There are two general ways of approaching software design
| (and I 'm paraphrasing Tony Hoare here): 1. You can write
| software so simple there are obviously no errors 2. You can
| write software so complex there are no obvious errors_
|
| And both are neither here, nor there, regarding what the
| article talks about, which is basic advice that always holds:
| avoid complexity, say no whenever possible, opt for 80/20
| solutions.
|
| > _One thing that escapes "grug" is that achieving 1. often
| requires more sophistication than their magical club allows._
|
| Which is irrelevant to grug's point, as he doesn't pretend to
| advocate achieving 1.
| nonethewiser wrote:
| You're focusing on coding style but it sounds more like hes
| talking about business requirement.
|
| If we are talking about coding style, then the things you have
| identified as actually not simple are by definition not what
| the article favors.
| Barrin92 wrote:
| > Instead of addressing complexity head-on with abstraction,
| "grug" will beat "galaxy brain" over the head.
|
| the argument made in the piece is more nuanced than that. The
| author points out that you often _cannot_ address complexity
| head on (in particular not with abstraction), because you don
| 't even know what your complexity looks like, as the author
| says, complexity isn't trivial to see.
|
| This was the old problem of inheritance as a paradigm which
| tried to anticipate structure of programs and code when often
| you can't anticipate what shape your program is going to take,
| often leaving you in dead ends and wrong hierarchies or
| taxonomies.
|
| The author isn't saying to not abstract at all but to not do it
| early. Casey from Handmade Hero had a similar style he called,
| IIRC 'compression' based programming, implying that you write
| your code, and as you go over it again and again you see where
| duplication pops up and only then you factor it out into some
| higher abstraction.
| geekbird wrote:
| This. Develop the logic and flow for all of the thing, make
| it big, code it simple and even redundant, but really basic
| and simple. That's your "proof of concept". Pass two is
| finding and factoring out all of the redundant stuff into
| functions and libraries, grouping like with like. It's like
| in relational database design - first you grab all the fields
| needed, then group them and normalize them.
| ImprobableTruth wrote:
| I think the post actually touches on this? It doesn't say that
| you shouldn't abstract, just don't abstract too early.
| shams93 wrote:
| Then there's the Super Mario developer, I putta all 50,000,000
| lines of code into one a fantastic pasta bowl file just for a
| you!
| frostwarrior wrote:
| That's the classic "only coder" mindset. Instead of being
| uncomfortable learning about software architecture, side
| effects or even pure functions, tries to solve every problem
| with for and while loops.
| WesolyKubeczek wrote:
| Sir, may I remind you that when you get down to it, your
| architecture and higher order functions are all made of
| branching and for and while loops, and branching and for and
| while loops are all made of goto.
| vnorilo wrote:
| And gotos are made of jump instructions which are made of
| NAND gates, transistors and silicon. Good abstraction is
| all about hiding the details that are not essential to the
| problem at hand.
| WesolyKubeczek wrote:
| I wanted to say jump instructions at first, but gotos are
| more hated and considered harmful in these quarters.
|
| You hide the details but you never forget they're there,
| lest they spoil and start smelling really bad.
|
| (Also, apparently the MOV instruction on amd64 gives you
| Turing completeness as proved by that crazy compiler, so
| gotos may be made of MOVs sometimes, but meh)
| lmm wrote:
| A particular _implementation_ might use those things, and I
| will meet it on its terms when I need to. But that 's a
| mechanical convenience, nothing more. My top-level code is
| written for people to read, and only incidentally for
| machines to execute.
| recursivedoubts wrote:
| ^ sound convince and probably very big brain right at times
|
| however!
|
| beware apply advice put form data from web page into database
| with many layers abstraction not needed! grug see many time!
|
| fear of looking dumb (FOLD) _great danger_ in such
| conversations and beware!
| eurasiantiger wrote:
| titzer wrote:
| Undoing someone's copy-pasted for-loops and while-loops is
| called "factoring" and undoing someone's bad abstractions is
| called "re-factoring" and is about 10x as slow. At this point
| in my career I have seen _way more_ crappy abstractions and
| needlessly abstracted code than grug-brain code.
|
| And, to be brutally honest, as much as I love those functional
| combinators, first-class functions, streams, etc, they suck to
| reason about.
|
| Sometimes loops are better!
| lmm wrote:
| > And, to be brutally honest, as much as I love those
| functional combinators, first-class functions, streams, etc,
| they suck to reason about.
|
| > Sometimes loops are better!
|
| That I think is backwards. A loop could be doing literally
| anything - it probably _is_ futzing with global variables -
| so there 's no way to reason about it except by executing the
| whole thing in your head. A map (or mapA) or a fold (or
| foldM) or a filter or a scan is much more amenable to
| reasoning, since it's so much more specific about what it's
| doing even without looking at the body.
| andyferris wrote:
| I like to write loops where they follow the functional
| map/filter/reduce paradigm where they don't mutate anything
| except some initial variables you "fold" over (defined
| immediately prior to the loop) and which are treated
| immutable (or uniquely owned) after the loop.
|
| I find this has good readability and by containing the
| mutation you can reason about it "at a distance" quite
| simply since further away it's for-intents-and-purposes
| pure code.
|
| What you might lose are the compiler-enforced guarantees
| that a functional language gives you. Some languages give
| you the best of both worlds - with rust you could put this
| in a pure function (immutable inputs, owned outputs) and
| the borrow checker even reasons about things like this
| within a function body.
| galaxyLogic wrote:
| I think a loop is ok if it only modifies variables whose
| scope is the loop.
|
| And that's what map() basically does.
| philosopher1234 wrote:
| Not true in reality, so your theory must be wrong.
| lmm wrote:
| I've been doing this professionally for over a decade and
| it's been true in my experience, shrug.
| eurasiantiger wrote:
| I think you found the head of the nail, so let me hit it:
|
| "Simple" code is simple to reason about, but it is not as
| expressive.
|
| "Complex" code is just as simple to reason about, but being
| more expressive, it requires more intimate knowledge of the
| language features and abstractions used.
|
| Then there is "bad" code, which is confusing for reasons
| other than domain complexity.
|
| Sometimes complexity just gets handed to a developer even if
| they say no, and that doesn't make their complex code bad
| code.
| stonecolddevin wrote:
| I personally almost always use loops (in Java) unless I know
| the dataset being dealt with is small, unless I'm writing
| stuff in Scala where maps and flatMaps are first class, but
| diving into Scala is its own can of worms.
| joshuamorton wrote:
| I've seen a massive, "simple", abstraction-free function of
| 500-1000 lines take smart engineers _quarters_ to safely
| "factor". I've seen this same thing happen a handful of
| times. Big spaghetti function requires someone to build a new
| test suite from scratch so that they can refactor safely,
| because everything ends up having spooky surprising distant
| effects, because there isn't any abstraction to contain
| things.
|
| They're dead simple, there's no abstraction, its just loops
| and variables (and state, which is the real killer). But
| they're impossible to reason about as a result.
| jjoonathan wrote:
| It _will_ go away -- to other devs, who will awkwardly and
| painfully route around grug, adding loads of complexity. Not
| grug 's complexity, though!
| lijogdfljk wrote:
| > Most well-intentioned "grug" developers will write software
| so simple that it becomes it's own form of complexity: a giant
| mud-ball of for-loops, while-loops, variable assignments, and
| other wonderful side effects. Instead of addressing complexity
| head-on with abstraction, "grug" will beat "galaxy brain" over
| the head.
|
| Hah. Related, i became disgruntled with my previous favorite
| language for this reason. It promoted this style of
| development. Surface level simplicity built into the language,
| with minimal tools to actually manage the complexity that is
| inherent to the problem space you're working in.
| short_sells_poo wrote:
| Alright I'll bite :)
|
| Python? Java? C? Assembly?
| mgsouth wrote:
| That would make for some interesting posts. "How X promotes
| wishful simplification," for various values of X. I imagine
| some common traits would be probably be "X makes simple
| things simple," with "it makes hard things look like simple
| ones." But there's also "X has defaults that Just Work"
| with "until they don't." I don't think I'd include
| assembly, C, or Java in those categories. Python? Maybe;
| "batteries included" is starting to break down. Go? Yep.
| Goroutines and channels usually work well for simple stuff,
| often for more complicated, and the core libraries follow
| that pattern. Model failures tend to be buried and solved
| when the service is turned off and back on. Rust? Don't
| think so; its schtik is making hard things into blockers.
| Web frameworks? Yes, oh very yes. Lisp? "Simple? Blink
| blink. Oh, you mean elegant."
| kapp_in_life wrote:
| My guess would be Go since I've heard that as a common
| complaint.
| bityard wrote:
| Not who you're replying to, but Tcl was that language for
| me. Dead-simple syntax, documentation, and behavior. I
| loved it. But also dead-simple tools. And if you wanted to
| do anything that wasn't a "solved problem" already, you had
| to write your own library.
|
| When I switched my focus to Python, everything was more
| effort but I could also do _much_ more with it.
| lmm wrote:
| Interesting - I found TCL to be very much the opposite,
| because it makes "meta" things so easy. Like, if you want
| to write your own control flow construct, you can go
| right ahead, it's like Lisp except that it's easier to
| write macros.
| dusted wrote:
| > And if you wanted to do anything that wasn't a "solved
| problem" already, you had to write your own library.
|
| For which language is that statement not true ?
| girvo wrote:
| Their point is that the language they're discussing
| requires you to write that library far more often than
| other languages, as a second order effect of few using
| it. But you know that already, you just want to make a
| semi-snarky reply instead, I guess.
| dahdum wrote:
| As usual the truth is somewhere in the middle. I've seen nearly
| $1m in development cost and a year of time lost to the
| complexity demon due to big brains playing AWS Service Bingo
| while a competitor hired a single grug to do the same task.
|
| That single grug got it done in ~1 month for basically nothing,
| and without the multiple AWS service overhead it ran much
| faster, fewer resources, and dead simple to maintain. Bigger
| company bought the smaller one, then proceeded to toss the grug
| code and continue the big brained approach, as far as I know
| never reaching parity.
|
| But there were cool network diagrams, data diagrams, and all
| sorts of new, interesting, and complex technology developers
| enjoy playing with.
|
| I'm more inclined to side with grug now.
| joe_the_user wrote:
| The OP's point is that being able to produce a simple
| solution to a complex problem only seems like the product of
| "refusing to be smart" from the outside. From the inside,
| there's always a delicate balancing act - each step involves
| choosing approaches that may generate complexity just in
| different ways. The same data used in different places in the
| application? What do you do? Objects? Globals? Cut-and-paste.
| Any of those solutions might be fully justified or might
| degenerate into a tangle by the time the application is done.
| Once, if you have a nice, simple working application, you can
| say "it's all just 'grug'" but that's essentially what they a
| call "humble brag".
| [deleted]
| pkulak wrote:
| Whoa now, I was with you until you seemed to imply that
| "simple" software means shitty code. Simple in this context
| means a solution with as little complexity as possible.
| Hopefully written elegantly and carefully, with lots of thought
| for future maintenance and readability.
|
| Maybe you use a 10-year-old, constantly maintained and
| thoroughly tested library to do 90% of the work instead of
| writing everything yourself.
|
| Would it be faster to compute some end state without
| intermediate calculations? Probably. But how about we just spin
| a loop forward instead if it's more accurate that way and
| easier to understand.
|
| What if we cached values, then made sure the caches are always
| in sync? That should speed things up. Well, maybe we'll write
| it without caching and see how that goes first.
|
| How about an intricate system of locks and serializable
| transactions so that multiple requests can run at the same
| time? Or maybe we just queue things up and run them one at a
| time.
|
| Nothing to do with nested for loops.
| femiagbabiaka wrote:
| I think of it as being more of a spectrum where abstractions
| get introduced as they're needed. The case where one has
| thousands of lines of imperative code that is terrible to debug
| and probably not unit tested is one where the correct
| abstractions were never introduced at the place and time they
| were appropriate. Getting this right is almost impossible,
| that's why we have refactoring practices.
| jfoutz wrote:
| could you give an example of (1)?
|
| Only because i have run into weirdness with printf calling
| malloc, back in the day. Even hello world makes me a little
| nervous about those claims.
|
| But I'd love to see a sample with explicit assertions about the
| environment, so I could be sure there are obviously no errors.
| emilsedgh wrote:
| > a giant mud-ball of for-loops, while-loops, variable
| assignments, and other wonderful side effects. Instead of
| addressing complexity head-on with abstraction
|
| I very much prefer to work in a codebase of poorly written
| loops and variable assignments rather than one with poor
| abstractions.
|
| Poor abstractions can harm way, way more than spaghetti code.
| Their harm usually spreads out through system.
|
| Imagine this:
|
| * 1 single poorly written function which takes a number of
| inputs and has an output, but internally it's long and messy.
|
| * A bunch of abstracted entities, which interact throughout the
| system, but are poorly designed.
|
| The complexity of 1 is isolated to the implementation. There's
| a nice encapsulation. Removing/Rewriting is easy.
|
| But 2 becomes a complete mess which is not isolated. You'd have
| to skin it layer by layer. Thats way more scary to me.
| [deleted]
| kinbiko wrote:
| Kevin, is that you?
| beaker52 wrote:
| Grug feel related, make grub happy. And not know why but grug
| notice that grug style make easier leave club resting. Grug think
| practice talk grug to inside grug, make club battle few.
|
| Also, grug not know if big brained or grug. Grug think grug but
| not see big brained. Big brained think big brained stop big brain
| and become grug. When stop think grug big brain, big brain grug
| return. Hard, and bore. Life such.
|
| Now sleep, soon shiny rocks collect.
| armatav wrote:
| Now this is a good post. Especially the part about the frontend
| Complexity Demon having a grip on the entire industry, and the
| Fear Of Looking Dumb. It goes hand in hand.
| 49531 wrote:
| > frontend Complexity Demon having a grip on the entire
| industry
|
| Is frontend web development more complex than it needs to be?
| If so, how?
| aaaaaaaaaaab wrote:
| Hehe, good one!
|
| Oh, you're serious? :D
| recursive wrote:
| npm, babel, webpack, module compatibility, et al
| koonsolo wrote:
| You are free to develop everything in vanilla JavaScript
| and run your coded scripts straight in the browser. Very
| non-complex.
|
| But the team that uses npm, babel, webpack etc will crush
| you both on development speed and stability.
| crooked-v wrote:
| The whole CJS/AMD/UMD/ESM nightmare has included some
| prominent devs intentionally breaking packages for certain
| build types because 'ESM has been around for a while, why
| haven't you updated yet?'
| bobkazamakis wrote:
| this is art and all of us should be ashamed.
| DevKoala wrote:
| > unfortunately also many test shamans exist. some test shaman
| make test idol, demand things like "first test" before grug even
| write code or have any idea what grug doing domain!
|
| I am keeping that.
| MrPatan wrote:
| This is true and excellent, and I'd put it next to Hickey's
| "Simple made easy" and Metz' "The Wrong Abstraction" as something
| I wish every developer would grok.
| TheOtherHobbes wrote:
| In "Simple Made Easy" he's recommending XML, JSON and even SQL
| for data. So I'm going to have go to with "No."
|
| All that does is move somewhat messy language constructs into
| somewhat messy data constructs.
|
| The data is static-ish, which is nice. But the associated code
| has exploded in complexity and with XML particularly you can't
| even be sure if it's truly compliant - especially if it's
| coming from an outside source.
|
| So I think that whole talk is spectacularly missing the point.
| The _idea_ is good but functional /read-only doesn't solve the
| problem.
|
| Because some problems are just hard, and no amount of
| functional twiddling makes the hardness go away.
|
| Names are hard. International localisation is hard. Dates and
| calendars are hard. International holidays and special dates
| are hard. Addresses are hard. Timezones and time systems are
| hard. Phone numbers are hard.
|
| There is no trivial solution to any of these problems.
|
| The most effective solution would be an international standard
| collection of algorithms and APIs baked into identical standard
| libraries for each mainstream language.
|
| What you get instead is a lot of people wasting time and energy
| solving these problems over and over - badly.
|
| And in fact XML, JSON, SQL, etc are similar. There are
| _countless_ libraries and frameworks for managing these, and
| they 're all slightly different and likely to fail in different
| ways - not just in different languages, but in multiple
| competing frameworks for the same language.
|
| The problem isn't the code, it's the culture around it. Instead
| of solving a problem completely and standardising, the industry
| is addicted to nearly-but-not-quite solving the same problems
| over and over.
|
| That's where a lot of unnecessary complexity comes from.
| vlunkr wrote:
| I would recommend those to anyone here that hasn't seen them.
|
| I think this requires a big shift in community thinking.
| Programmers are trained in universities to throw OOP principles
| at every problem, and the DRY principle has deeply taken hold.
| Obviously both have their place, but they often used
| overzealously and come at the expense of readable and
| maintainable code.
| pyrolistical wrote:
| Heh, me not grug brained right?
___________________________________________________________________
(page generated 2022-06-22 23:00 UTC) |