How To Avoid Big Upfront Design

Поділитися
Вставка
  • Опубліковано 31 гру 2024

КОМЕНТАРІ • 66

  • @MohammedElotol
    @MohammedElotol 2 роки тому +41

    "A minimum viable product (in software) is not a mess of code that barely works, but a well-done piece of software that is perhaps missing some of the features that would be necessary to call it 'done' or 'ready' from a business perspective."

  • @sewera.account
    @sewera.account 2 роки тому +31

    The best time for me to see this video was over a year ago, when I started my over-engineered project for my B. Sc.
    Thankfully, the second best time is now, when I have many more projects ahead of me.

  • @arturk9181
    @arturk9181 2 роки тому +18

    10:33 hahaha that caught me off guard!

    • @travispulley5288
      @travispulley5288 2 роки тому +1

      I just watched his advice on the subject previously, so I was ready for it (see ua-cam.com/video/llaUBH5oayw/v-deo.html )

  • @tudz123
    @tudz123 2 роки тому +8

    10:33
    Please don’t get tired of reminding us! Had a good lol when I heard it 😂

  • @robwatson826
    @robwatson826 2 роки тому +10

    How often should we test? "All the f***ing time" - Dave Farley, 2022

  • @travispulley5288
    @travispulley5288 2 роки тому +10

  • @jimhumelsine9187
    @jimhumelsine9187 2 роки тому +3

    Yes. Yes. Yes. Yes.
    We can't predict the future, but we can't avoid it either. I often quote the chorus from "Que Será, Será" as an metaphor:
    Que sera, sera
    Whatever will be, will be
    The future's not ours to see
    Que sera, sera
    What will be, will be
    We need to design our code to be flexible enough for any future that will be, even if we cannot see it at the time. Design Patterns have always worked well for me in trying to achieve this.

  • @ronylev-ari3219
    @ronylev-ari3219 2 роки тому

    another great video and I really appriciated the concrete example of a design problem and the thought process involved when approacing it

  • @techsuvara
    @techsuvara 10 місяців тому

    Excellent info Dave!

  • @hannesvanniekerk2256
    @hannesvanniekerk2256 2 роки тому +1

    Rewatched that f-bomb drop 3 times :D Uncle David keeping it real in another great video.

  • @somewhereinyorkshire4782
    @somewhereinyorkshire4782 2 роки тому +1

    Great video. I am reminded of a quote from Michael Jackson (The programming guru of old, not the singer) who said something like "Don't work on detail unless you're really good, in which case, don't do it yet"

  • @krumbo
    @krumbo 2 роки тому +1

    Hahaha, just shared this video with another branch of our company. They always start as Big Upfront Design and then stuck because just crazy complex. Like stuck every time.

  • @BryanFinster
    @BryanFinster 2 роки тому +2

    19 seconds in and it sounds like Dave is quoting me. I must be on the right track!

  • @m.x.
    @m.x. Рік тому

    1) "If the only tool you have is a hammer, you tend to see every problem as a nail." Big up-front design is not dumb at all when the requirements, size/complexity and context tell you so, 2) the true technological, scientist and mindset revolution wasn't during the mystified Enlightenment, but rather the Renaissance with the discovery of America, 3) SOLID, High Cohesion, Low Coupling, SoC , DRY, KISS, YAGNI, etc. are concepts that have been around for quite a long time, most developers just don't understand or know how to apply them.

  • @Gemasted
    @Gemasted 2 роки тому +7

    Upfront design when the parameters are unknown is definitely something to be avoid. However continuing on evolutionary designed code when the problem is well understood can be just as problematic if not more so.
    I've seen countless projects where people tolled on a hard to maintain system for years just because you "shouldn't" do a big refactoring, the most successful systems I've seen are systems where people rewrite and redesign it completely upfront from scratch one or two times.

    • @BryanFinster
      @BryanFinster 2 роки тому +3

      How do you know the problem is well understood?

    • @Gemasted
      @Gemasted 2 роки тому +2

      @@BryanFinster because you've written the system already :)

    • @errrzarrr
      @errrzarrr 2 роки тому

      This, exactly this

    • @BryanFinster
      @BryanFinster 2 роки тому

      @@Gemasted I’ve frequently seen that not matter. :)

    • @hipvivid
      @hipvivid 2 роки тому +1

      Isn’t rewriting it from scratch what we’re trying to avoid here? If we now know how it should be designed to reduce maintenance pains then we should work to refactor those portions of the code that are causing us issues.
      If we ended up with a big ball of mud and a huge amount of technical debt then this is surely a case of not taking enough care to refactor as the project progressed.
      This shows the importance of refactoring as we go along so are design isn’t hindering our ability to change and maintain the software.

  • @brownhorsesoftware3605
    @brownhorsesoftware3605 2 роки тому

    I always start with the UI which keeps you on a track of making the fewest assumptions as well as additional insight into the functional design. The initial design is the simplest list of the tasks the software needs to accomplish which grows as you work on (code and run) the software. You always build on what works so writing test code is superfluous. The backend can evolve independently and your backend bugs are immediately visible. I don't know if my process has a name. 😀 Your video has inspired me to formulate something I just took for granted.

    • @hypenage2415
      @hypenage2415 2 роки тому +1

      I think youre right for this design pattern and I practice the same when making software. Steve Jobs once said “youve got to start with the customer experience and work backward toward the technology, not the other way around”

    • @mx-hx
      @mx-hx 2 роки тому

      Interesting idea, but "writing test code is superfluous" is a big smell. There are tons of reasons why TDD / BDD are currently considered best practices (not widely implemented properly, but widely dreamed about by devs with aspirations).
      If you do write up your method/practice in depth, do let us know where to read it. If you've really found a way to develop software better making testing superfluous, I want to think about it deeply with you 🙂

    • @brownhorsesoftware3605
      @brownhorsesoftware3605 2 роки тому

      @@mx-hx I did not say that testing is superfluous, I said writing test code is superfluous. That is because the production code IS the test code. On the contrary, the code gets more testing because you always run the final code, not a generated test based on a possibly false assumption.

  • @thmstbst
    @thmstbst 2 роки тому +1

    I recently interviewed at a job that said they were using tests, but they only seemed to use them to assign work. What I mean by that is team leads would write the test, then pass it off to someone else to complete the feature. They seemed to have a lot of custom functionality for individual customers too.
    If I end up working there, how should I adapt? I guess I could write additional tests, but I would be worried about being seen as creating additional work.

    • @BryanFinster
      @BryanFinster 2 роки тому +3

      Honestly, I wouldn’t work there if that’s how they work.

    • @thmstbst
      @thmstbst 2 роки тому

      @@BryanFinster thanks for replying, I'm sure that's your honest opinion. I guess I'm just trying to think through why it's a bad idea. Some places are similar in that a manager give requirements, as a go between. It's just not in the form of a test.

    • @BryanFinster
      @BryanFinster 2 роки тому +2

      @@thmstbst both of those are honestly terrifying to me. I’ve heard of places like that, but that level of micro-managing destroys product value and the souls of people working there. It’s one of the worst anti-patterns that exists for value delivery.

    • @gamer-gw9iy
      @gamer-gw9iy 2 роки тому +2

      @@thmstbst I guess it depends what kind of tests they are assigning, if it's super high level (which I doubt), you might get some (little) breathing room. I'd work there only because I'm only going to be working for this summer before I continue school😂

    • @ContinuousDelivery
      @ContinuousDelivery  2 роки тому +2

      I probably agree with Bryan, If these tests are high-level "executable specs" for a feature, as @gamer describes, that only say what the user should perceive at the end, then fine. If not, this really won't work well. There are lots of places that try to write SW this way, but they aren't very good at writing SW!
      If you have a choice, I'd look elsewhere. If you don't don't worry about adding more tests, because this is how you write good code faster, so it isn't "additional work" in the long run it is significantly less work.

  • @Immudzen
    @Immudzen 2 роки тому

    When working on any kind of simulator the one thing I think you have to do upfront design on is the actual math. What are the actual equations you are going to implement and why are they the right ones? This is such a foundational issue that it ends up touching a lot of the stuff the software does and while you can change it later it can also be quite painful.

  • @DinkarGuptaDG
    @DinkarGuptaDG 2 роки тому +3

    Toyota improvement kata in actual form for us engineers

  • @finne-dich-selbst-3395
    @finne-dich-selbst-3395 2 роки тому

    "Much of present-day software acquisition procedures rests upon the assumption that one can specify a satisfactory system in advance, get bids for its construction, have it built, and install it. I think this assumption is fundamentally wrong, and that many software acquisition problems spring from that fallacy. Hence they cannot be fixed without fundamental revision, one that provides for iterative development and specification of prototypes and products" - Fred Brooks, No silver bullet, 1986
    Only that currently we might be mistaken to think that something we have coded is ready. It will never be if we are able to learn, since learning changes our understanding, and should change software also. It would be great if these changes would be easy to implement.

    • @ContinuousDelivery
      @ContinuousDelivery  2 роки тому

      💯💯Exactly my point! I think that the only sensible approach is to start out assuming that we are probably wrong. That focusses us on being more defensive, and so, when we find out how and where we are wrong, we can easily fix it.

  • @karlgustav9960
    @karlgustav9960 2 роки тому +1

    This is all well and true in a world without graphical user interfaces. However for an e-commerce web site, users who hate your „first step“ will just not come back for further iterated versions. Sometimes first impressions do matter. That’s why disciplines like User Experience Design do exist. It is the UX Designers‘ job to design and test before things go into production. Sometimes several iterations go into a solid design doc that is handed to development and is then misunderstood and frowned upon as „big upfront design“ and important parts of it are ignored or changed at will out of ignorance or a false understanding of agile practices… I’d still say leave the design to the designers and the engines to the engineers :-)

    • @mx-hx
      @mx-hx 2 роки тому +2

      You are confusing visual/ usability design of the UI with structural/modular design of the codebase.
      To follow your analogy, you need both an aesthetic designer for the car body, but also a technical designer to make the engine blueprint.

  • @NickDanger3
    @NickDanger3 2 роки тому +2

    Dave, The foundations of modern science were laid in the middle ages. The “enlightenment“ was merely an ideological accretion on top of that foundation, and has nothing to do with science itself.

    • @ContinuousDelivery
      @ContinuousDelivery  2 роки тому +2

      Not really, one of the key ideas that gave birth to science was that decisions from authority are not guarantee. This was firmly an enlightenment idea. As feynman said, "science is the belief in the ignorance of experts". en.wikipedia.org/wiki/Age_of_Enlightenment

  • @TjSpoonManJacques
    @TjSpoonManJacques 2 роки тому

    Awesome!

  • @jamesgg9950
    @jamesgg9950 2 роки тому

    Keeping your design options open is great until you realize your last project's server code is still running SQL on CSV files because you deferred choosing a database.

    • @ContinuousDelivery
      @ContinuousDelivery  2 роки тому +3

      ...but since you were keeping your design options open, this should be a simple fix, of course, if you were keeping you options open, the SQL wouldn't have leaked outside the persistence code 😁😎

  • @Sergio_Loureiro
    @Sergio_Loureiro 2 роки тому

    10:32 "Test all the fucking time". No shit, Sherlock!

  • @foad-esad
    @foad-esad 2 роки тому

    I love it .... test all the f&^king time!

  • @motyakskellington7723
    @motyakskellington7723 2 роки тому

    not knowing what you want or keep failing at getting what you want

  • @BryonLape
    @BryonLape Рік тому

    Evolution is random, undirected change.

  • @mabdullahsari
    @mabdullahsari 2 роки тому

    I work in a team that gets scared when I define anything that ends with the suffix "Interface". ¯\_(ツ)_/¯

    • @krccmsitp2884
      @krccmsitp2884 2 роки тому +2

      Then choose another suffix, e.g. Contract, or choose another team. ;-)

    • @mabdullahsari
      @mabdullahsari 2 роки тому +1

      @@krccmsitp2884 It'll probably be the latter haha.

  • @way.journey
    @way.journey 2 роки тому

    Unless you are Mozart

  • @MisFakapek
    @MisFakapek 2 роки тому +4

    We need more code. There are too many words but not enough code. I feels like someone explaining how V8 engine works with tubo-charger without showing a mechanical schematics of how it works.

    • @ContinuousDelivery
      @ContinuousDelivery  2 роки тому

      ua-cam.com/video/ln4WnxX-wrw/v-deo.html

    • @gamer-gw9iy
      @gamer-gw9iy 2 роки тому +1

      The difference between a mechanic and a developer is that the mechanics tools will rarely change 😅 Only code that would be easy enough for most aspiring to learn some software engineering would probably be some really simple Python, but I doubt much Python will be used in 30-40yrs.. Teaching without much code will keep these lessons useful forever and for everyone 🙏

    • @mx-hx
      @mx-hx 2 роки тому +1

      You might need more experience, then you won't need the code to grasp & apply the concepts.

  • @sergmmm
    @sergmmm 2 роки тому

    👍

  • @pvtjoker3833
    @pvtjoker3833 2 роки тому +4

    What does not work: Teams of "architects" that are not developers (no real experience) and don't test what they propose. They are total idiots proposing "designs" that are fundamentally wrong. Corporations need to wake up and stop having these useless "architect" groups.

    • @ContinuousDelivery
      @ContinuousDelivery  2 роки тому +1

      Yup, I talk about architecture here: ua-cam.com/video/ElMnHDSFaCw/v-deo.html

    • @mx-hx
      @mx-hx 2 роки тому

      Do you work at my company? 😀

    • @mikeguantonioify
      @mikeguantonioify 2 роки тому

      100% Agree!!!

  • @bc4198
    @bc4198 2 роки тому

    There's something fascinating here where the things that get published are the things that get finished, with the side effect being that they are less evolved. They were able to finish because they stopped getting better ideas...