[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)
        
 (HTM) web link (principles.dev)
 (TXT) 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 <task> 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 <insert
         | favorite programmer uses> 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)