• 0 Posts
  • 35 Comments
Joined 11 months ago
cake
Cake day: August 14th, 2023

help-circle
rss







  • I think people are being lazy, in a selfish, tragedy of the commons sort of way.

    When standing in line, they all watch the customer stand there doing nothing as the cashier checks out items. If only they’d bag their own things, we’d all be able to get on with our lives that much sooner. Instead, they continue standing there doing nothing, as the cashier now bags their items.

    Then the next person in line moves up and also just stands there, also unwilling to do anything to help speed things along.



  • I feel a lot of advice here is trying to push the learning envelope without considering fun & the learning experience. This is for an 8 yr old, and I’m seeing suggestions that would seriously challenge high schoolers, college students, and even some software engineers in industry I’ve encountered.

    For the software aspects of programming, I would suggest looking at programming(-esque) games and web browser programming environments. Here’s a solid short list, vaguely sorted from “proramming-esque” to “actual programming”:

    • https://upperstory.com/turingtumble/ - A physical algorithmic marble and lever puzzle “board game”. Great (and designed for?) for kids. Not programming.
    • Factorio - A factory-building game that “feels” a lot like software development. Not programming.
    • Opus Magnum - mechanical puzzle game by Zachtronics, build algorithmic “molecule-building machines”. Not programming.
    • <Any other game by Zachtronics> - varies from “not-programming” to “contains programming”. Can get pretty difficult sometimes.
    • Human Resource Machine - Programming puzzle game using assembly-like language. Later stages are challenging.
    • 7 Billion Humans - “sequel” to Human Resource Machine, more featureful language, has concurrency and randomness. Later stages are challenging.
    • https://www.hedycode.com/ - An innovative learning programming lang and “levels” method that makes Scratch primitive by comparison. Has free online lesson plan & environment. Hedy level 18 is vanilla Python.
    • https://www.codecademy.com/ - you said you’re using this already

    Suggestions to go physical tinkering with electronics is good, but I’m unable to make good suggestions there.

    A real computer and coding environment/shell could be good for system admin skills, but the learning curve is steep. You’ll also have to be okay with letting him accidentally brick the computer (best way to learn!).



  • IMO okay advice for specific types of issues, but way too prescriptive to work well generally.

    Steps 3-4-5 are good, and breaking it down like that could be helpful to readers, but in my mind, it should be so well practiced and executed so naturally that it feels like a single step. I also think there ought to have been a mention of the fast iterative experimentation where 3-4-5 is repeated.

    Break the build (and block other devs)? Is this a 1-team company?

    Write a test first? Maybe, if you’ve already got a well isolated, somewhat understood problem whose solution won’t require deeper restructuring.

    Immediately “Brainstorm as many hypotheses … as you can think of”? Inefficient if you already have a good idea of what’s wrong (wasting time guessing), and also inefficient if you have absolutely no idea what’s wrong (wasting time with uneducated guesses).





  • avoiding merge conflicts

    No, not like that – you misunderstand. I’m not talking about actively avoiding conflicts. Coordinating to avoid merge conflicts is the same work as resolving a merge conflict anyway, just at a different time.

    I’m talking about creating practices and environments where they’re less likely to happen in the first place, never incurring the coordination cost at all.

    One example at the individual level is similar to what you mentioned, but there’s more to it. E.g. atomically renaming and moving in separate commits, so git’s engine better understands how the code has changed over time and can better resolve merges without conflict.

    But there’re other levels to it, too. A higher-order example could be a hot module where conflicts frequently occur. Sure, atomic commits and all that can help “recover” from conflict more easily, but perhaps if the hot module were re-designed so that interface boundaries aligned with the domains of changes that keep conflicting, future changes would simply not conflict anymore.

    IMO the latter has an actual productivity benefit for teams/orgs. Some portion of devs just aren’t going to be that git proficient, and in this case, good high level organization is saving them from losing hours to incorrect conflict resolutions that can cause lost work, unintended logical conflicts (even though not lexical conflict), etc. Plus, it implies abstraction boundaries better match the changes demanded by the domain, so the code is likely easier to understand, too.


  • It’s kind of difficult to explain in the same way git is difficult to grok on the first try.

    Perhaps it’s convincing enough to just say:

    • Git is the fundamentally better at resolving merges/rebases without conflicts than older VCS that don’t maintain a commit tree data structure.
    • Even within just git, using one diff algorithm vs another can mean the difference between git successfully merging vs failing and showing you a conflict
    • Software is flexible – there are endless permutations to how it can be structured. Everything else being equal, some code/commit structures are more prone to conflicts than others

    I.e. whether a conflict will happen is not some totally unpredictable random event. It’s possible to engineer a project’s code & repo so that conflicts are less common.




  • You’re getting a lot of conceptual definitions, but mechanically, it’s just:

    keeping state (data) and behavior (functions) that operate on that state, together

    At minimum, that’s it. All the other things (encapsulation, message passing, inheritance, etc) are for solidifying that concept further or for extending the paradigm with features.

    For example, you can express OOP semantics without OOP syntax:

    foo_dict.add(key, val)  # OOP syntax
    
    dict_add(foo_dict, key, val)  # OOP semantics