<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: James</title>
    <description>The latest articles on DEV Community by James (@jdheywood).</description>
    <link>https://dev.to/jdheywood</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F22162%2Fd65898d1-bbb4-4e61-8d95-edf2d203ccad.jpeg</url>
      <title>DEV Community: James</title>
      <link>https://dev.to/jdheywood</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jdheywood"/>
    <language>en</language>
    <item>
      <title>To React or Not?</title>
      <dc:creator>James</dc:creator>
      <pubDate>Wed, 24 Apr 2019 21:30:47 +0000</pubDate>
      <link>https://dev.to/jdheywood/to-react-or-not-2n8e</link>
      <guid>https://dev.to/jdheywood/to-react-or-not-2n8e</guid>
      <description>&lt;p&gt;We're building a SaaS platform at &lt;a href="https://www.60decibels.com" rel="noopener noreferrer"&gt;work&lt;/a&gt; and have a choice of JS framework to make.&lt;/p&gt;

&lt;p&gt;In my last two roles leading dev teams we had similar choices to make and shortlisted React, Angular and Vue. In both teams, we decided (democratically) to select React as our framework of choice and merrily cracked on with that.&lt;/p&gt;

&lt;p&gt;I won't bore you with the reasons why, there are a million posts about which framework to choose, and we referred to some of these, set our own criteria of importance and then reviewed and rated each of the contenders before voting.&lt;/p&gt;

&lt;p&gt;But, crucially, this was before Cambridge Analytica, the undermining of democracy and live streaming of murder.&lt;/p&gt;

&lt;p&gt;Re: Angular, Google also has issues regarding some of its practices, (maybe this is just a defining characteristic of tech unicorns?), for example regarding content on Youtube, if you can monitor and take down copyright infringing content surely you can monitor content designed to spread hate and fear?&lt;/p&gt;

&lt;p&gt;But, is it fair to level criticisms of the creators of these tools and frameworks at the tools and frameworks themselves? To put it another way, can you separate the creator from the creation?&lt;/p&gt;

&lt;p&gt;What if we take an analogy from art? Whether or not you consider software development an art form (which is an interesting but wholly different topic, let's leave that for another day, or perhaps a dev discuss?) it doesn't matter for the purposes of this comparison; can you separate Michael Jackson's music from Michael Jackson?&lt;/p&gt;

&lt;p&gt;It can be easily argued (especially given the recent documentary) that you can't, and there is a very clear case for boycotting his work, at least not providing further remuneration to his estate for this anyway. (Can you listen to a 2nd hand copy of one of his CDs though?)&lt;/p&gt;

&lt;p&gt;Can the same be said for use of a software tool or framework? Even if that tool is open source by using it are you lending support to that software, and so by extension to its creator?&lt;/p&gt;

&lt;p&gt;Can, or more importantly, &lt;em&gt;should&lt;/em&gt; the behaviour and/or practices of the creator of a piece of technology be a criterion for selection of this technology?&lt;/p&gt;

&lt;p&gt;And if we do, what weight do ethics have on selection, is this on an even footing with say community support, potential talent pool, extensibility, learning curve, or any other criteria you may choose?&lt;/p&gt;

&lt;p&gt;From a purely pragmatic point of view, my head says weigh up the needs of the team, company and users and make the best practical selection, but it doesn't feel right, technology doesn't exist in a vacuum, it is increasingly interwoven in our lives and if we are concerned with improving user's lives through better technology, shouldn't we who are in a position of choice make an ethical one?&lt;/p&gt;

&lt;p&gt;What are your thoughts on the ethics of software selection, am I just indulging myself, does this chime with anyone, would love to hear what the community thinks.&lt;/p&gt;

&lt;p&gt;Thanks for reading,&lt;br&gt;
James&lt;/p&gt;

</description>
      <category>technology</category>
      <category>ethics</category>
      <category>choice</category>
    </item>
    <item>
      <title>Applying a Naming Convention to Constraints via SQLAlchemy &amp; Alembic</title>
      <dc:creator>James</dc:creator>
      <pubDate>Thu, 14 Feb 2019 10:56:42 +0000</pubDate>
      <link>https://dev.to/jdheywood/applying-a-naming-convention-to-constraints-via-sqlalchemy--alembic-45e8</link>
      <guid>https://dev.to/jdheywood/applying-a-naming-convention-to-constraints-via-sqlalchemy--alembic-45e8</guid>
      <description>

&lt;h1&gt;
  
  
  Top Tip!
&lt;/h1&gt;

&lt;p&gt;So we're creating a new database schema, using SQLAlchemy for the ORM and Alembic for the schema management, (if you use Python and need to manage a database sructure I highly recommend these two tools), anyway we just ran into a problem when downgrading a migration that attempted to drop an unnamed Foreign Key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wat?!
&lt;/h2&gt;

&lt;p&gt;Why would it allow me to create a constraint that it can't drop, why? Good question, turns out that it's up to you (well me in this case) to name things.&lt;/p&gt;

&lt;p&gt;Obviously we don't want to have to remember to do this manually everytime we generate a migration involving a constraint, that would be tedious and prone to error (I will definitely forget to do this), so what do we do?&lt;/p&gt;

&lt;p&gt;Well Alembic has you covered, you can set a naming convetion to apply to all migrations, when declaring your Base model class (this should be default behaviour in my opinion, but I'm not hating, nothing but love for you Alembic/SQLAlchemy).&lt;/p&gt;

&lt;h2&gt;
  
  
  Cut to the chase and tell me how
&lt;/h2&gt;

&lt;p&gt;Well like this;&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from sqlalchemy import MetaData
from sqlalchemy.ext.declarative import declarative_base

meta = MetaData(
    naming_convention={
        "ix": "ix_%(column_0_label)s",
        "uq": "uq_%(table_name)s_%(column_0_name)s",
        "ck": "ck_%(table_name)s_%(constraint_name)s",
        "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
        "pk": "pk_%(table_name)s"
    }
)

Base = declarative_base(metadata=meta)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://alembic.sqlalchemy.org/en/latest/naming.html"&gt;Source alembic docs for reference are here&lt;/a&gt; thank you alembic peeps!&lt;/p&gt;

&lt;p&gt;So there you go - simply use the Base in your alembic env.py - and also inherit from Base in all your model classes and you're good to go&lt;/p&gt;

&lt;p&gt;You'll see autogenerated migrations like this; &lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    ...
    sa.PrimaryKeyConstraint('id', name=op.f('pk_thing'))
    ...
    sa.ForeignKeyConstraint(['wotsit_id'], name=op.f('fk_thing_wotsit_id_wotsit')),
    ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Enjoy!&lt;/p&gt;


</description>
      <category>sqlalchemy</category>
      <category>alembic</category>
      <category>constraints</category>
      <category>toptip</category>
    </item>
    <item>
      <title>Engineering Team Manifesto</title>
      <dc:creator>James</dc:creator>
      <pubDate>Thu, 31 Jan 2019 16:56:33 +0000</pubDate>
      <link>https://dev.to/jdheywood/engineering-team-manifesto-4n89</link>
      <guid>https://dev.to/jdheywood/engineering-team-manifesto-4n89</guid>
      <description>&lt;p&gt;The time has come for me to move on from my current role, and as is frequently the case when changing jobs this situation provides an opportunity to reflect on things, what went well and not so well and how I will approach the next opportunity.&lt;/p&gt;

&lt;p&gt;One of the things I am most proud of from my time at &lt;a href="https://www.airfinity.com" rel="noopener noreferrer"&gt;Airfinity&lt;/a&gt; (and there are quite a few, not least of which is the amazing team I worked with, props to you guys) was the culture of the engineering team we set out to build and achieved.&lt;/p&gt;

&lt;p&gt;As the first permanent engineering hire I was responsible for hiring and building out the team and our capability and the first thing I did was to sit down and think about the culture I wanted the team to have, the type of team i wanted to hire and work with, the kind of thing you don’t often get the chance to directly influence.&lt;/p&gt;

&lt;p&gt;To ensure I had a point of reference I wrote this down, and looking back on it now it strikes me that this was in some way a manifesto for how I think technical teams should be, so I thought I’d share it with you here, because not only is it something I firmly believe in and that we should all aspire to, it was something we achieved and I am immensely proud of that, so here it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Engineering Team Culture
&lt;/h2&gt;

&lt;p&gt;The culture of a team is one of the major factors influencing how enjoyable work is, it is vital that as we grow we nurture and retain a supportive, collaborative and enjoyable team culture. &lt;/p&gt;

&lt;p&gt;This manifesto outlines a few main points that we would like to define our engineering team culture, it has been put together by the team lead with consultation and input from all members of the company.&lt;/p&gt;

&lt;h3&gt;
  
  
  We are all Product Engineers, not Software Engineers.
&lt;/h3&gt;

&lt;p&gt;The distinction is important, we must all contribute to the definition of features and direction of the product. If we have empathy for our users we will create better products, everything we do should be aligned with the strategic goals for our products and company.&lt;/p&gt;

&lt;h3&gt;
  
  
  There are no stupid questions.
&lt;/h3&gt;

&lt;p&gt;If you have a question, just ask. You will not be ridiculed or made to feel bad for asking or checking something. We must all prefer to answer a question to help keep work moving or clarify an issue than have someone struggle because they are reluctant to ask.&lt;/p&gt;

&lt;h3&gt;
  
  
  We strive for clear and frank communication.
&lt;/h3&gt;

&lt;p&gt;When we stop communicating we are in danger of doing or building the wrong things, we must all keep informed about what we are working on (hence our stand ups, estimation, etc) &lt;/p&gt;

&lt;p&gt;BUT - a brief conversation &amp;gt; an hour long meeting&lt;/p&gt;

&lt;p&gt;Strive to communicate clearly and often, avoid expensive team meetings where possible (leave those meetings to the team lead if engineering must be present)&lt;/p&gt;

&lt;h3&gt;
  
  
  We will remain as flat as a pancake.
&lt;/h3&gt;

&lt;p&gt;There is no hierarchy, there are however variations in depth and breadth of experience. &lt;/p&gt;

&lt;p&gt;We should celebrate our differences and remember that we are greater than the sum of our parts, rather than adhere to a layered hierarchy. &lt;/p&gt;

&lt;p&gt;We are all Product Engineers, it’s just that some of us have different areas of specialism and more or less context to the company and technical stack.&lt;/p&gt;

&lt;h3&gt;
  
  
  Everyone is able to work on any part of the technical stack.
&lt;/h3&gt;

&lt;p&gt;We’re not saying that we want homogenous skill sets, as that is unrealistic, but we do want the ability to share the work across the team (via mentoring where needed) for multiple reasons; &lt;/p&gt;

&lt;p&gt;It keeps things interesting and provides learning opportunities&lt;/p&gt;

&lt;p&gt;It fosters a culture of knowledge sharing, preventing knowledge silos&lt;/p&gt;

&lt;p&gt;It means that we can take holidays without fretting about something back at work &lt;/p&gt;

&lt;h3&gt;
  
  
  We actively encourage learning and development.
&lt;/h3&gt;

&lt;p&gt;We want to build and maintain a team that enjoys learning new things, this growth mindset must be a key trait of team members. &lt;/p&gt;

&lt;p&gt;Learning new technologies and techniques increases our value to the team and improves the products we build as well, it also motivates team members and helps drive innovation&lt;/p&gt;

&lt;h3&gt;
  
  
  Build, test, deploy, review, iterate.
&lt;/h3&gt;

&lt;p&gt;Better to ship a feature quickly and review its usage/impact than to fuss over every possible edge and side case and take forever.&lt;/p&gt;

&lt;p&gt;We can always iterate a feature, but we won't catch every edge or side case upfront so ship it and review&lt;/p&gt;

&lt;p&gt;Long running tickets cause bottlenecks in delivery, ship and move on, raise a new ticket if needed&lt;/p&gt;

&lt;h3&gt;
  
  
  Deploy your own code, and sometimes other people’s!
&lt;/h3&gt;

&lt;p&gt;We are all responsible for deploying our own features, unless unable to or it makes sense for someone else to do it&lt;/p&gt;

&lt;p&gt;Sometimes it is helpful to deploy others code, and from other areas of the technical stack to your usual responsibilities, this helps share knowledge and workloads&lt;/p&gt;

&lt;h3&gt;
  
  
  If you broke it, you fix it.
&lt;/h3&gt;

&lt;p&gt;Related to the above two points, bugs happen, if we don’t break a few things then we aren’t moving fast enough&lt;/p&gt;

&lt;p&gt;BUT, if you break something by deploying your work, you have to fix it.&lt;/p&gt;

&lt;p&gt;Of course your team-mates can ridicule you for the bug/all help out to resolve the issue, you will never be on your own when this happens&lt;/p&gt;

&lt;h3&gt;
  
  
  Have fun.
&lt;/h3&gt;

&lt;p&gt;What’s the point of all this if we can’t have a bit of a laugh? &lt;/p&gt;

&lt;p&gt;Let’s try and have fun whilst we work and if it’s ever not fun, please let your team lead know so they can try and fix things/address any issues&lt;/p&gt;

&lt;h2&gt;
  
  
  In summary
&lt;/h2&gt;

&lt;p&gt;So there you have it, reflecting on this document (written nearly 2 years ago) I feel like we achieved this in our team, so I’d like to preserve this here for future reference and as a reminder that a supportive, collaborative and fun work environment is achievable with a bit of effort and perhaps also some good fortune regarding the organisation and context you are a working in.&lt;/p&gt;

&lt;p&gt;I’ve worked in tech for twenty years and sadly this kind of environment has proven to be the exception, but I will do my utmost to ensure this culture prevails in all of my future roles and teams, I hope this inspires you to try the same.&lt;/p&gt;

&lt;p&gt;Thanks for reading,&lt;/p&gt;

&lt;p&gt;James.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.jdheywood.com/blog/2019/1/31/engineering-team-manifesto" rel="noopener noreferrer"&gt;Originally posted on my blog&lt;/a&gt;&lt;/p&gt;

</description>
      <category>engineering</category>
      <category>culture</category>
      <category>team</category>
      <category>environment</category>
    </item>
    <item>
      <title>The 'Just' Jar</title>
      <dc:creator>James</dc:creator>
      <pubDate>Tue, 05 Dec 2017 10:58:30 +0000</pubDate>
      <link>https://dev.to/jdheywood/the-just-jar-5lo</link>
      <guid>https://dev.to/jdheywood/the-just-jar-5lo</guid>
      <description>&lt;p&gt;I thought I'd write a quick post to describe one of the little tweaks we recently made to our development process here at &lt;a href="https://www.airfinity.com" rel="noopener noreferrer"&gt;Airfinity&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Our dev team works in month long sprints at the moment and we generally take a day to estimate the top of the product backlog as a team, this is then used for a final re-shuffle of priorities by our product owner before we crack on and start building things. Of course things change over the course of the sprint, and we roll with that, the most useful information to facilitate this agility is reasonable estimations of size, complexity and duration.&lt;/p&gt;

&lt;p&gt;One of the most common and dangerous words that I have heard when estimating or discussing software features, especially when discussing these with non-technical parties, is the word 'just'.&lt;/p&gt;

&lt;p&gt;Many articles have been written on this so I won't bore you with why, if you build things you'll know what the problem is, but for reference two good muses on the topic are &lt;a href="https://alistapart.com/blog/post/the-most-dangerous-word-in-software-development" rel="noopener noreferrer"&gt;here&lt;/a&gt; and &lt;a href="https://jaxenter.com/the-most-dangerous-word-in-the-english-language-for-all-developers-108018.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So to combat our use of the word we set up a swear jar*, or Just Jar^tm as we like to call it. Every time one** of our dev team uses the word just we cough up a pound, the proceeds of this will go towards extra drinks at our Christmas bash. &lt;/p&gt;

&lt;p&gt;It's a fun way to game behaviour and slowly change it, it helps us clarify our thoughts and think through estimation a little more to ensure we allow enough time, and it's fun calling people out. Plus we have about £30 in the jar after our first month, so it's pretty lucrative!&lt;/p&gt;

&lt;p&gt;I suggest you give it a try, let me know what you think or how you get on in the comments.&lt;/p&gt;

&lt;p&gt;James&lt;/p&gt;

&lt;p&gt;*Obviously we still swear every now and then, the odd expletive is ok as long as it's directed at your own code.&lt;/p&gt;

&lt;p&gt;** Edit: I should point out that I am possibly one of the worst offenders/highest contributors, but hey you lead by doing right?&lt;/p&gt;

</description>
      <category>collaboration</category>
      <category>team</category>
      <category>behaviour</category>
      <category>estimation</category>
    </item>
  </channel>
</rss>
