[HN Gopher] Software Engineering principles to make teams better
___________________________________________________________________
 
Software Engineering principles to make teams better
 
Author : _wp_
Score  : 261 points
Date   : 2021-06-30 13:59 UTC (9 hours ago)
 
web link (principles.dev)
w3m dump (principles.dev)
 
| AdamCraven wrote:
| Oh wow, author here - I wasn't quite expecting this to appear
| here today. I've only really just start talking to people about
| it.
| 
| That said, my mission is to make software engineering better for
| everyone. By capturing the best principles from the best in the
| world at what they do. And to organise and share that knowledge,
| freely.
| 
| It's currently missing features to organise principles well, but
| I'm working on it (discussion here:
| https://github.com/PrinciplesDotDev/principles/discussions/2...)
| 
| You can reach me through my profile or following me on
| @princples_dev (twitter) - I've only starting pushing this, but a
| lot more will be coming soon.
| 
| It's an open source project and it needs your principles to make
| this a reality so if you've got some to share, please do. Or if
| you have feedback, leave it here. I'm building it for you.
 
  | vvladymyrov wrote:
  | Is there one page where all principles and information about
  | them are collected as one page so it can be downloaded and read
  | in ereader?
 
    | AdamCraven wrote:
    | All principles on the website are currently in this
    | repository: https://github.com/PrinciplesDotDev/principles In
    | fact, this is the database for the website.
    | 
    | So you can download them from there and put it in an ereader
    | or import it into an application that supports .md format.
 
| vageli wrote:
| What does "Iterate in Thens" mean?
 
  | AdamCraven wrote:
  | Well to quote the "what" of the principle
  | https://principles.dev/p/iterate-in-thens/
  | 
  | You should iterate sequentially on a focused chunk of work at a
  | time. Once that chunk has been completed THEN start on the next
  | chunk of work. This is opposed to doing multiple chunks of
  | different of work in parallel.
  | 
  | It's really a way of working as opposed to operating on code.
 
  | EricE wrote:
  | Click on it and find out?
 
| bilalq wrote:
| It'd be cool if counter-points to a principle could also be
| documented alongside it. Reasoning that highlights why you may
| not want to adopt a principle is helpful when considering it.
| 
| For example, take "One single source of truth".
| 
| >Data should be held in one location, duplicates of that data
| should be by reference only.
| 
| >Why
| 
| >Changes to data are always propagated to the rest of the system.
| 
| >Mutations to the data need only happen in one place.
| 
| >Single source of truth means no data will be out of sync or fail
| to be updated.
| 
| >How
| 
| >Only allow data writes to happen in one location. Whether that
| be a call to a rest API, system call or other write actions.
| 
| >Don't allow data to be stored anywhere but the single source of
| truth.
| 
| That won't work in many situations. If you need to support high
| throughput OLTP use-cases but also want to support advanced
| filtering/sorting of large datasets, you may need something like
| a combination of a NoSQL DB with something like ElasticSearch.
| Eventual consistency is something you accept as a trade-off for
| enabling higher levels of performance.
 
  | AdamCraven wrote:
  | It's funny you chose that principle in particular because it
  | does have an exception listed:
  | 
  | https://principles.dev/p/one-single-source-of-truth/
  | 
  | > Exceptions > Highly distributed systems - Some systems rely
  | on data consistency to be reached eventually or may never need
  | to have accurate data.
  | 
  | I've written about exceptions here:
  | https://principles.dev/documentation/#exceptions-optional
  | 
  | In general, exceptions should be quite broad and people can add
  | these to the principles if they know of them.
  | 
  | They can also have higher priority "contradictory principles"
  | which override the lower priority principles in certain cases.
  | 
  | Overlapping of principles create complex behavior so it is
  | usually better to have a list of principles in priority order
  | (this will be covered under emergent behavior in "principle-
  | driven engineering") which can override the "single source of
  | truth" principle.
  | 
  | An example might be: Engineers will know they should use
  | single-source of truth, but as performance should be critical
  | (or they have a specific business rule that states something
  | must take less than 5ms) it will override that principle.
  | 
  | Does that answer your question or do you think it needs to be
  | more refined than that?
  | 
  | I wonder if making the principles editable by the team would be
  | a useful feature, so you'd be able to add your own exceptions
  | to them for your particular use case.
 
| CraigJPerry wrote:
| I think i've got a slightly different take - i'm not saying my
| take is any better though.
| 
| If we're talking engineering principles, not team dynamics, then
| it's:                 1. Use immutability by default, even in
| languages that make that harder than it should be       2.
| Understand how liberating idempotency is       3. Divide and
| conquer, use abstraction to make hard problems manageable
| 4. Delete code, delete tests, re-write stuff, re-write it again.
| Painful? Keep doing this till you get to the other side and feel
| liberation and empowerment, took me years to get past wincing at
| the idea of re-writing that thing AGAIN       5. Pay attention to
| your build tooling - to do any given task, it should always take
| exactly 1 command. How do i run the tests? Run the test command.
| How do i deploy to non-prod? Run the deploy command. Etc
| 
| If we're talking softer stuff:                 1. Don't block
| collaboration - e.g. if there are 5 people don't work on 5 tasks
| concurrently. Work on 1, maybe 2 in some cases       2.
| Accomodate 2 types of work: work that needs collaboration &
| synchronisation (brain storming, planning, why are we even doing
| this, that kinda thing) work that needs focus time - sometimes
| that's focus as an individual, sometimes that's a mob focussed on
| one task and saying no to every other distraction in the world no
| matter how "urgent"       3. Change what you're doing throughout
| the day, don't try to code all day, you'll get in a rut, you
| won't write your best code after a while. You can optimise this
| step, e.g. if the team is low energy after lunchtime, use that to
| your advantage and schedule the easy boring work then, don't be
| afraid to use humour or burn low energy time just getting to know
| each other better       4. Make sure people are being heard in
| the team. Hardest point to get right.
 
  | majkinetor wrote:
  | Everything is great there, and in particular number 2 is
  | awesome and 5 is FTW !
  | 
  | Also, don't let people guess what are those commands - create a
  | menu that is run as soon as you clone the repo and shows all
  | commands. I now use Invoke-Build [1] system for that and on all
  | projects you type ib ? to get that list and later ib  to
  | execute it (or any combination of it, i.e. ib DropDatabase,
  | Run, Test). Basic tasks are named the same on all projects no
  | matter the underlying technology.
  | 
  | Later you use the same command on CI server - its just another
  | developer that runs ib Build, Test, Publish. Any more
  | programming in CI yaml files then 1 to 3 lines per job is so
  | wrong.
  | 
  | [1] https://github.com/nightroman/Invoke-Build
 
  | macintux wrote:
  | > Use immutability by default, even in languages that make that
  | harder than it should be
  | 
  | That and referential transparency are huge wins. It is a shame
  | languages like Python make it such a challenge.
 
    | wlpu wrote:
    | It's easy to do immutability in python, just use NamedTuple
    | for classes and tuple instead of list
 
      | shabbyrobe wrote:
      | Since PEP 591 [1], if using mypy with Python 3.8+ or the
      | typing_extensions module, you can also take advantage of
      | typing.Final, which lets you statically verify something
      | isn't changed. The catch is that it isn't enforced at
      | runtime.                 [1]:
      | https://www.python.org/dev/peps/pep-0591/
 
      | macintux wrote:
      | I'll research those, thanks. Any suggestions for OSS
      | projects that do so today?
 
        | gravypod wrote:
        | This is a good talk that demos NamedTuple:
        | https://www.youtube.com/watch?v=wf-BqAjZb8M
 
      | japanuspus wrote:
      | ...or `dataclass(frozen=True)` if you need the ergonomics.
      | 
      | For non-primitive members, `frozenset` is in the standard
      | library, but frozen dictionaries are unfortunately lacking.
 
      | rurp wrote:
      | I second this. My current job is the first place I've
      | worked where the convention is to use NamedTuples for most
      | things I've seen dicts used for on past projects and I
      | quite like the pattern. It both makes the code more
      | readable and avoids a number of subtle bugs that can crop
      | up.
 
      | joshuamorton wrote:
      | Please don't do this, there are far better approaches. Use
      | dataclasses/attrs that are frozen for immutable record
      | types.
      | 
      | (Specifically avoid namedtuples unless you're hoisting a
      | tuple to a real record. Record types also being a weird
      | union with a tuple is...oft confusing)
      | 
      | For immutable basic data types, adopt type annotations and
      | prefer to use sequence/iterable and mapping to direct
      | didn't/list types. These provide statically verifiable
      | immutability and also allow begin to encourage useful
      | async-friendly patterns.
 
    | CodeMage wrote:
    | This was the first time I've encountered the mention of
    | "referential transparency", so I looked it up and went down a
    | deep rabbit hole. It seems that it's normally used to
    | describe the property of not having side effects, however, I
    | also found this long explanation on Stack Overflow:
    | https://stackoverflow.com/a/9859966/58099
    | 
    | So now I'm more confused than when I initially read your
    | comment. Do you mean "referential transparency" as in
    | "expressions without side effects" or do you mean it in some
    | other way that I don't understand yet?
 
      | macintux wrote:
      | I just mean it in the sense of functions without side
      | effects on data in the program (I'm not fussed about I/O).
 
  | mrits wrote:
  | Don't expect a better result after a rewrite. Be prepared to
  | accept that.
 
    | chii wrote:
    | > Don't expect a better result after a rewrite
    | 
    | but what's the point then? why spend effort for it, if it
    | isn't expected to be better?
 
      | TeMPOraL wrote:
      | > _but what 's the point then?_
      | 
      | Learning. The result may not be meaningfully better, but
      | you gain fuller understanding of the problem domain. The
      | third rewrite might have a chance of being an improvement
      | ;).
 
        | lowercased wrote:
        | You may just learned that there's no more meaningful
        | improvement to be made. That should probably be
        | documented somewhere after that discovery is made.
        | 
        | Somewhat relatedly, I've refactored processes down from
        | 25 hours to 20 minutes. It got to 20 minutes, and other
        | people started nitpicking that it could 'be faster' (the
        | same people who'd let it get to 25 hours, then threw up
        | their hands and said "it can't be fixed"). They spent
        | loads of time getting it from 20 minutes down to... 17-18
        | minutes (spending 2+ weeks in the process). I'd indicated
        | "there's really no more 'there' there - this is about as
        | fast as it's going to get, without faster hardware". They
        | had to find out for themselves there wasn't much more
        | juice left in the tank.
        | 
        | Maybe it's not related, but I felt like sharing it
        | anyway... :)
 
        | bobthepanda wrote:
        | Meaningful improvement is in the eye of the beholder.
        | There's the old tale of how Google found out 500ms in
        | latency was a 1% drop in traffic.
        | http://glinden.blogspot.com/2006/11/marissa-mayer-at-
        | web-20....
        | 
        | 20 to 17 minutes is a 15% time savings still.
 
        | RussianCow wrote:
        | Next time my boss asks why I rewrote that component for
        | the third time instead of doing real work, I'll answer
        | "learning". ;)
        | 
        | In all seriousness, from a business standpoint, it's
        | almost never worth rewriting anything unless you're
        | already making significant changes to that code. The
        | opportunity cost of not spending that time building
        | things that get you paid is just too high--not to mention
        | all the new bugs that you're likely to introduce.
 
        | TeMPOraL wrote:
        | I wrote it a bit tongue in cheek, but honestly, I've
        | recently started to consider writing the _first_ solution
        | as a pure learning exercise. I.e. when writing a new
        | module /feature, I lean towards getting a solution
        | implemented quickly, fully expecting to immediately scrap
        | most (or all) of it, and write it again. Most of the
        | time, this happens way before the code goes into review
        | phase, so nobody knows I've actually written something
        | twice.
        | 
        | In my experience, most of the insights cluster in two
        | places: just as you start writing your solution, and just
        | as you think you're done with it. So you want to get
        | through the whole process quickly, just to learn the
        | things you need to write a proper solution.
        | 
        | Related, from a different HN thread -
        | https://news.ycombinator.com/item?id=27692710 - "action
        | produces information".
 
    | Scarbutt wrote:
    | You make it sound as they are talking about full rewrites but
    | it's actually about rewriting stuff here and there.
    | 
    | You are also assuming one just rewrites stuff blindly and
    | randomly without any prior new insight.
 
      | BurningFrog wrote:
      | I took that to mean refactoring the code, not throwing it
      | away and start over.
 
  | hammock wrote:
  | > 2. Understand how liberating idempotency is
  | 
  | Can you give some examples?
 
    | Fishkins wrote:
    | Say you have a batch job that performs tasks A-E, and each of
    | those tasks might process thousands of records. At some
    | point, something will go wrong that causes the process to
    | crash, hang, or error over many records. If the code is not
    | idempotent, you need to investigate exactly where things
    | started going wrong and figure out how to resume the process
    | at that point. You don't want to reprocess records and e.g.
    | send out duplicate emails or double-increment some number
    | you're tracking. If the code is idempotent, conversely, you
    | can just start the whole process over again without having to
    | worry about any of that.
    | 
    | Similarly, many systems involve consuming from some message
    | queue. It's basically impossible to guarantee exactly-once
    | delivery in most systems. You either have to risk missing a
    | message, or having it delivered multiple times. If you're
    | running idempotent code, you can always err on the side of
    | redundant delivery without any ill effects.
 
      | RazorX wrote:
      | Last week I ordered a screen protector for my phone. I got
      | two boxes in the mail. I thought I ordered twice by mistake
      | but they had the same order number on the packing slip.
      | 
      | My immediate thought was that some order processing step
      | somewhere is not idempotent.
 
      | tgb wrote:
      | How do you make something idempotent if one of the effects
      | is sending an email?
 
        | yen223 wrote:
        | You can't make everything idempotent.
        | 
        | You should still try and make most things idempotent.
 
        | zentropia wrote:
        | Side effects go to the border of the app. You keep track
        | if for some message X you have sended the email, so you
        | garantie that you send it once.
 
    | [deleted]
 
    | e40 wrote:
    | And is another way to say this "side-effect free"?
 
      | rcfox wrote:
      | The Linux shell command 'touch foo' is idempotent, but not
      | side-effect free.
      | 
      | Reading a variable shared between threads without a lock is
      | side-effect free but not idempotent.
 
        | zomglings wrote:
        | Interestingly, `touch` is not idempotent because it
        | modifies timestamps. Not being pedantic, just an
        | interesting consideration. `mkdir -p` is idempotent, I
        | believe.
 
        | [deleted]
 
        | mytailorisrich wrote:
        | You're absolutely correct, it's not idempotent for the
        | crucial reason you mention. It's crucial because updating
        | the timestamps _is_ the main purpose of  'touch' in the
        | first place!
 
        | omegalulw wrote:
        | Reading a variable isn't side-effect free either :P
 
        | rcfox wrote:
        | In the sense that you're moving data in to a register and
        | updating the program counter?
 
        | zomglings wrote:
        | Opening Schrodinger's box isn't side-effect free. :)
 
  | AdamCraven wrote:
  | I really like that you've thought about these - and feel free
  | to submit them not only will you get a founding badge but if
  | you're the first person to create it you'll be known as the
  | source of them in the future.
  | 
  | It's not really about better or worse, what I've found is
  | different people have different backgrounds and what principles
  | they find useful is based on several things, which may be
  | immuntable - such as strongly held values.
  | 
  | You're never going to make me not care about aesthetics for
  | example, as that is intrinsic to me and that will affect the
  | principles I like and ultimately the people that I work best
  | with.
  | 
  | An analogy I like to think about is that people with very
  | different principles are like two people holding a rope and
  | pulling away from each other - you aren't going to get anywhere
  | fast.
  | 
  | Whereas people with similish principles, will generally go in
  | the right direction. Sure, they'll get tangled up from time to
  | time and you won't always want to get in exactly the same way.
  | But there's a collaborative nature to it and you'll both
  | improve.
 
    | Jenk wrote:
    | > feel free to submit them not only will you get a founding
    | badge but if you're the first person to create it you'll be
    | known as the source of them in the future.
    | 
    | That sounds wrong. As in "I could upload quotes from Gang Of
    | Four books and claim I am the source" wrong.
 
      | AdamCraven wrote:
      | A lot of thought has gone into the licensing. Hopefully
      | I've covered all bases.
      | 
      | You can't be an author if you aren't the author of a
      | principle or the principle is too generic. If the principle
      | is already open source (e.g. on wikipedia, has a creative
      | commons license) you can submit it but not claim you are
      | the author for it and submit it under the same licensing
      | terms (CC-BY-SA) as long as it doesn't break the license.
      | 
      | Codifying the principle for the first time takes effort and
      | people can iterate on it to make it better over time. Many
      | people may have had similar thoughts before, but if it's
      | not a general principle already being used the first to
      | turn it into a principle - to put a stake in the ground -
      | benefits everyone and can help improve everyone's
      | capability.
      | 
      | I believe the author should be rewarded for that effort, as
      | long as it is their own unique work.
 
        | lupire wrote:
        | This sea a lot more work for no benefit, compared to just
        | writing a (hypertext) book and citing sources.
 
        | AdamCraven wrote:
        | The eventual benefit is having access to many community
        | sourced principles as a resource, which are getting
        | better over time as people contribute.
        | 
        | Then being able to create your own lists for unique
        | situations. Say "Lupire's CTO list" or "Lupire's
        | management principles" and to share that with your team
        | or as a reminder to yourself.
        | 
        | Of course you should always be able to export it and put
        | it in a format that's useful to you. And that's been
        | really important to the design. From using markdown
        | format to embedding license information and meta data
        | with the principle, it should help a lot with
        | portability.
 
  | RussianCow wrote:
  | I agree with everything except for this:
  | 
  | > 4. Delete code, delete tests, re-write stuff, re-write it
  | again. Painful? Keep doing this till you get to the other side
  | and feel liberation and empowerment, took me years to get past
  | wincing at the idea of re-writing that thing AGAIN
  | 
  | With experience I've realized that rewrites are almost never a
  | good idea[0]. They are time consuming and inevitably introduce
  | new bugs (or reintroduce old ones), and the benefit is almost
  | always marginal. If your architecture allows it, it's better to
  | sandbox working legacy code and leave it as-is than constantly
  | rewrite it.
  | 
  | My own policy is: if you're making significant changes to a
  | unit of code anyway, clean it up or rewrite it; otherwise, make
  | the smallest change necessary and leave it alone. If it ain't
  | broke, don't fix it.
  | 
  | (Obligatory Joel Spolsky article on the topic that everyone has
  | probably already read:
  | https://www.joelonsoftware.com/2000/04/06/things-you-
  | should-...)
  | 
  | [0]: ...with a possible exception if you're at a very large
  | tech company with a lot of resources, where the testing/QA
  | processes are a lot more thorough and it's possible to keep up
  | with constant changes like this. But even then, seeing the
  | amount of bugs introduced with each update to Facebook or
  | Gsuite or any other large piece of tech, I'm skeptical.
 
    | gregmac wrote:
    | My thinking definitely aligns with yours on this:
    | 
    | > if you're making significant changes to a unit of code
    | anyway, clean it up or rewrite it; otherwise, make the
    | smallest change necessary and leave it alone. If it ain't
    | broke, don't fix it.
    | 
    | Don't be afraid to rewrite something when it needs it, and
    | build knowing it's very possible you'll rewrite later.
    | 
    | If there are good unit tests, and it's a sufficiently
    | small/decoupled piece of code, then rewriting is not so bad.
    | These are all self-reinforcing things: small, decoupled code
    | tends to be easy to rewrite; Testable code tends to be
    | decoupled.
    | 
    | Systems always get more complex over time. The key thing is
    | figuring out when your simple component is starting on the
    | path to getting too complex, and taking the time to rewrite
    | it as early as possible -- maybe it should be two smaller
    | components, or maybe the entire organization of that are
    | needs to be different. If you wait, and just keep adding
    | "small" things, eventually you have a monster that's an order
    | of magnitude more complex to deal with.
    | 
    | The other bit of this is writing code knowing you can (and
    | may likely) rewrite it later. If you try to predict the
    | future complexity early in design, 9 times out of 10 you
    | _will_ get it wrong, and you 'll end up in a lose-lose
    | situation: you have a overly-complex component to deal with,
    | and it ends up needing a rewrite later anyway. Rewriting this
    | is even harder because you have to undo the unnecessary
    | complexity. This is also known as YAGNI ("You Aren't Gonna
    | Need It").
 
    | bob1029 wrote:
    | > With experience I've realized that rewrites are almost
    | never a good idea [...] If your architecture allows it, it's
    | better to sandbox working legacy code and leave it as-is than
    | constantly rewrite it.
    | 
    | What if your architecture is the problem? If you got the
    | domain model wrong and you have deeply-nested complex types
    | used throughout, you will never break free without a clean
    | sheet rewrite. Certainly, you can refactor bits and pieces to
    | conform to a correct model, but it's going to be an uphill
    | battle the whole way. 10x if you are already in production
    | with business state tied to the legacy schema(s).
    | 
    | Most of the horrible things I have seen at code review time
    | have a root cause somewhere in poor domain modeling.
    | 
    | For example: Someone put support for 2 customer addresses as
    | facts directly in the Customer type, so now you can't deal
    | with the new edge case of 5+ addresses per customer, or model
    | the idea that the address might be shared between more than 1
    | customer (and/or some other business types).
    | 
    | If you didn't model for 3NF/BCNF/DKNF up front, you might as
    | well start over from the beginning in my experience. If your
    | problem domain is not that complex, you can probably survive
    | with something really shitty, but the moment you enter into
    | 50+ types, 1000+ facts and 100+ relations, things are
    | impossible to manage without strong discipline in this area.
 
      | lazyasciiart wrote:
      | I might, grudgingly, support this kind of rewrite, if it
      | was proposed with a domain model that can already support
      | all existing data. If it's proposed with "a new domain
      | model would be so much nicer! We could do it right!" then
      | hell no.
      | 
      | I'd still prefer to do it incrementally if possible.
 
| chadlavi wrote:
| > Note: This visualization was designed for screens larger than
| 1024 x 1024 and for desktop-style interactions. You can proceed
| if you'd like.
| 
| Why would you put in the work to warn people they'll have a bad
| time instead of just fixing the bad time.
 
  | AdamCraven wrote:
  | Can you show me where that is or what visualization that is?
  | 
  | I haven't put anything on the website intentionally, perhaps
  | it's auto generated.
  | 
  | The only page that I haven't purposely optimised for mobile is
  | the editor, as you can't really create principles on your
  | mobile.
 
    | dkryptr wrote:
    | Their comment is on the wrong post. I think they meant to
    | comment on this post:
    | https://news.ycombinator.com/item?id=27689664
 
  | cloverich wrote:
  | Are you asking: "Why would you do less work when you could do
  | more work?" -- not meaning to be trite I just think the answer
  | follows directly from your question -- its much less work to
  | say "I haven't optimized or even evaluated this for mobile"
  | than to optimize a site for mobile, particularly if there is
  | some important interaction you want which is easily achievable
  | on a desktop sized screen (like drag and drop columns for
  | instance).
 
| darkrai0707 wrote:
| This is a great initiative. It would be great if across each
| principle, we can have examples on how this principle helps to
| improve the code quality
 
  | AdamCraven wrote:
  | Some principles do have this already, it depends on the
  | princple. They tend to be more code focused, such as compute
  | properties when possible: https://principles.dev/p/compute-
  | properties-when-possible/
  | 
  | It would be hard to do it for every case, as principles
  | interact together to create more complex behaviors. I'll be
  | discussing this more in "emergent behaviors" in "principle-
  | driven engineering" at some point. But the essence is
  | architecture can arise from a few principles together. It's a
  | bottom up approach to architecture where team members
  | understand the "why" so there are shared mental models between
  | the team.
 
| sublimefire wrote:
| Give it some time and it will end up being "The 5 Pillars of the
| AWS Well-Architected Framework" or something similar.
| 
| Someone already mentioned that "time" is absent here. Hence you
| cannot generalize. Each company should probably write their own
| principles and make it part of their identity.
 
  | AdamCraven wrote:
  | Indeed. That is definitely the next steps to allow individuals
  | and eventuall companies to create their own principle lists.
  | 
  | There are no principles that make sense in every situation,
  | there are no teams that will have the same principles.
  | 
  | Imagine being able to have a team and then adopt those
  | principles easily into your team? That's the goal.
 
| maerF0x0 wrote:
| > Backend ... no principles found
| 
| Site checks out
| 
| https://imgur.com/a/orYiokW
 
  | AdamCraven wrote:
  | Haha! It won't be long until there are some there.
  | 
  | I may take out the filters by technology choice for the time
  | being, because there's nothing there.
 
| markl42 wrote:
| Cool! Similar project I maintain:
| https://programming.protips.wiki/
 
| happyweasel wrote:
| 1. work as a team
 
| akhilpotla wrote:
| I think it would be interesting to read case studies of different
| teams, their principles, how those decisions have impacted them,
| benefits, drawbacks from their approach, etc.
| 
| I think principles are great, but like you yourself have said,
| they require context. I would especially be a valuable resource
| for junior and mid career engineers, of which I am one.
 
  | AdamCraven wrote:
  | I imagine teams will shared their principle lists on blog posts
  | and put reflections there.
  | 
  | Not all of it would appear on the principles.dev, as I think
  | the reflective nature would be best handled elsewhere. But
  | acknowledging pros and cons on the website is very valuable.
  | 
  | The next big piece of work I have to do is on principle lists (
  | https://github.com/PrinciplesDotDev/principles/discussions/2...
  | ) and figuring out what features to include and where to draw
  | the line is going to be tricky... I need to find the principles
  | behind it, really.
  | 
  | It's interesting that you say they would be a valuable resource
  | for a junior and mid-career engineers. I agree, it would. What
  | I've found is it generally attracts people who are a) leaders
  | (in some form or other) b) care about programming deeply.
 
| oneshoe wrote:
| I'm pretty excited about this site's potential. I am avid
| promoter of creating autonomous teams through principles and
| goals alignment (OKR).
| 
| I think there were suggestions about Time being an aspect of a
| principle. I wonder if this would be better represented by the
| SDLC stages, something like this might address the "time" part
| that allows it to be associated with type of work being done.
| Just a thought. I also wonder, at the same time, if this is too
| burdensome for a team or individual to do. Establishing your
| principles, IMHO, should be the most important thing you do, if
| you use them to guide your behavior.
| 
| I also have hope that when people establish what their individual
| principles (that define them) they then can ensure when they are
| job hunting or self reflecting on their current job that they
| what they are doing is aligned with who they are to ensure they
| will be satisfied in that role/job/company.
| 
| I just bookmarked the site. Excited to see this grow.
 
  | AdamCraven wrote:
  | Oneshoe, thank you.
  | 
  | On the SDLC, it could work. The temporal aspect is something I
  | need to think through in a way that's not too complicated.
  | Getting feedback at this stage is beneficial, even if this hit
  | HN a lot earlier than I was expecting.
  | 
  | Establishing your own principles is burdensome, but using
  | others is not. Having access to everyone else's principles and
  | being able to see what other successful teams use, makes it
  | easy to take other people's capability and add it to your own.
  | Imagine if you could see what principles Rob Pike or  or the principles behind a library,
  | framework or a particularly productive team? This gets me
  | excited. It gives people the building blocks to make great
  | things.
  | 
  | I totally agree that individual principles is extremely
  | important. If not for the very fact that finding and being on
  | aligned teams is an amazing experience for everyone involved.
  | Happier, more productive teams.
  | 
  | I would love to have an informal chat with you, you get what
  | I'm doing and it needs people like you to for this to succeed
  | for the community. Drop me an email if you can take me up on
  | the offer :)
 
| titzer wrote:
| Is it just me, but is this meme version of software engineering
| absolutely the lowest information density achievable? Seriously.
| This is a heavily-involved topic, where any project might require
| hundreds to thousands of hours of development, and we have five
| second soundbytes as principles. Ugh.
 
  | AdamCraven wrote:
  | In software engineering, the smallest behaviors interact to
  | cause more complex ones.
  | 
  | In most teams, it's hard to point to those small behaviors
  | because they have become habitual and you may have forgotten
  | what they are. Forgotten the "why".
  | 
  | What I see in teams that don't work well, is teams don't have
  | that guidance or don't share similar mental models to allow
  | them to work effectively together. So you end up arguing at a
  | higher level than the actual problem because you can't put your
  | finger on what you believe.
  | 
  | Principles build capability. Take Redux, it has just three core
  | principles: https://redux.js.org/understanding/thinking-in-
  | redux/three-p... and from those core principles you can almost
  | build the whole framework.
  | 
  | But more importantly it provides capability and confidence to
  | people using the framework to extend if needed in a "redux"
  | way. Instead of looking at the documentation, they know the
  | authors intent. The "Why"
  | 
  | That said, the site is really in it's earlist phase and the
  | principles will be improved over time with more in depth
  | information as more people contribute. Eventually, a voting
  | system will be in place so the best principles will come to the
  | top.
 
  | EricE wrote:
  | If you have ever heard any sports announcer/commentator go on
  | and on about "the fundamentals" - well, here you go. As he
  | points out little things quickly add up into big things. Don't
  | take my word for it - search out just about any interview with
  | a successful athlete about their career and I guarantee at
  | least some, if not a significant chunk of it will dwell on the
  | topic of "fundamentals".
 
| iandanforth wrote:
| I like a lot of these principles but there is a crucial element
| missing from this presentation and that is _time_.
| 
| As a company grows the importance of each of these principles
| changes. As a project within an established company grows a
| similar maturation happens.
| 
| If you tried to adhere to all 'best practices' (principles or
| not) from day 1 of a project you'd be carrying a lot of weight
| that could crush otherwise good ideas.
| 
| Some principles, when presented without a timeline, seem
| contradictory and that can lead to fights on teams where
| developers are well meaning but less experienced.
| 
| I'm encouraged that this presentation includes dimensions along
| which you can slice the principles, but I encourage the authors
| to adopt a "stage" dimension as well that helps focus
| devs/learners on principles appropriate for 1. The stage they are
| in and 2. The immediate next stage.
 
  | AdamCraven wrote:
  | The temporal nature of principles - It's a good suggestion.
  | It's always hard to slice reality.
  | 
  | Teams should come up with their own list of principles which
  | reflect the team and adopt organizational ones that make sense.
  | As organization ones will tend to be wider in scope and less
  | prescriptive, it should be less of a problem to adopt them.
  | 
  | Basically teams should decide what's right for them based on
  | their backgrounds and the organisation should provide general
  | direction.
  | 
  | The principles become more useful when they are context
  | sensitive, so principles lists are the next big feature (i.e
  | one for your team, another for your organization)
  | 
  | This feedback is really useful and will inform the design of
  | the app. If you have a good idea Ian of what you think is
  | useful, please let me know how I can help. I think I've grokked
  | the basics of what you're saying, but it would be good to lock
  | it down.
 
| doggosphere wrote:
| I once worked at a startup which had put together a _binder_ of
| documents, declaring the company 's vision, values, principles,
| etc. They strongly suggested new hires go through it at least
| briefly.
| 
| I don't think anyone ever did.
 
  | AdamCraven wrote:
  | Yeah, I know what you mean.
  | 
  | I've a few principles for that:
  | https://principles.dev/p/documentation-should-be-close-to-th...
  | and "They Ain't Gonna Read It" (not on the website, yet. But it
  | is here: https://blog.nuclino.com/brown-m-ms-or-why-no-one-s-
  | reading-...)
  | 
  | The trouble with the documents you've mentioned is they don't
  | really create capability and it's really the social structure
  | that enforces those values and principles as opposed to the
  | documents.
  | 
  | With engineering it's different because it provides tangible
  | value.
  | 
  | From a team perspective it can help you transfer mental models.
  | Programming is an abstract activity that benefits greatly from
  | those shared models. They build capability, help people learn
  | rapidly, settle disagreements, bring the team together as one
  | and are used in things like code reviews and filtering of
  | technical decisions. People come back to them again and again -
  | it's integrated. Then when a new member of the team comes a
  | long, you're not going back to those discussions again and
  | again.
  | 
  | As an individual. One of the reasons you look back at your
  | principles to remind why you believe something or to be more
  | convincing. They provide value, so they keep being used. It's
  | also part of that persons identity. It defines what they care
  | about and helps them join teams with people who are aligned.
  | 
  | So I agree to an extent - They Ain't Gonna Read It... Unless it
  | provides value.
 
___________________________________________________________________
(page generated 2021-06-30 23:00 UTC)