|
| 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) |