<?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: Jennifer Mackown</title>
    <description>The latest articles on DEV Community by Jennifer Mackown (@jcmc).</description>
    <link>https://dev.to/jcmc</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%2F325780%2Fb0a6e8f5-50a9-4045-82e3-762b1cc7ebfa.png</url>
      <title>DEV Community: Jennifer Mackown</title>
      <link>https://dev.to/jcmc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jcmc"/>
    <language>en</language>
    <item>
      <title>PHP Patterns Part 1 - Repository Pattern</title>
      <dc:creator>Jennifer Mackown</dc:creator>
      <pubDate>Mon, 27 Jan 2020 11:12:36 +0000</pubDate>
      <link>https://dev.to/jcmc/php-patterns-part-1-repository-pattern-34mp</link>
      <guid>https://dev.to/jcmc/php-patterns-part-1-repository-pattern-34mp</guid>
      <description>&lt;p&gt;As I do more work at new work, I expect I will come across a few of these patterns that I don’t know about. For some reason Software Design Patterns are a trigger for my deeply ingrained Imposter - I find myself regularly having to apologise for my lack of ‘proper’ computer science knowledge. So I am going to try to learn about them!&lt;/p&gt;

&lt;p&gt;This series is my attempt to fit ‘proper’ patterns and architecture definitions into my existing brain framework. As such it probably will rely heavily on the reader knowing exactly the same information as me which is kinda unlikely, so sorry if it doesn’t help you - it was only ever written to help me!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What do I already know?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the good(!) old days, we talked about implementing a Data Access Layer to separate out some of our complex logic from the database itself. Now the problem with this is not the idea itself, but the fact that we didn’t actually do it very well. There was never any real distinction between the data, controllers and the front end - we ended up with business logic in surprising places and didn’t leverage the separation of responsibilities nearly enough.&lt;/p&gt;

&lt;p&gt;What we were aiming for was something more like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Database model - basic SQLAlchemy table definitions, standard functions for the data like ‘create a new complicated thing’ or ‘add a new thing only if certain business conditions are met’ and massaging the data nicely for display&lt;/li&gt;
&lt;li&gt;Controllers - connect the data and the front end together&lt;/li&gt;
&lt;li&gt;Front End - get the users input/display world&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We referred to it as ‘fat models, thin controllers’&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The Repository Pattern - what is this new information?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So according to many googles, a repository is just a mechanism to map data to the application. Of course it’s a bit more nuanced than that really, but in essence it’s just some nice glue that we can use to get a ‘front end’ to talk to a ‘back end’.&lt;/p&gt;

&lt;p&gt;The way I understand it is that a repository sits between the db model and whatever other code you have and provides a simpler interface to the database, so you can read and write data easily. It is a stateless thing that takes your input or request for data in a nice straightforward way and returns whatever results in an equally straightforward way. The data could come from a proper database, redis, a flat file, you don’t need to know or care, it is masked by the repository and whatever the source the input/output/whatever methods all work in the same way. The code that interacts with the repository, to all intents and purposes, sees the repository itself as the datastore.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This does seem a bit overkill, but I think most of the examples I’ve been reading through are so simple and contrived that it doesn’t make sense to actually use this pattern. New work is still too new to comment, but I can definitely see the advantages of a design like this for old work. If nothing else, it would have solved our endless unit testing problems, because it would have helped separate out the actual database so we could truly test in isolation.&lt;/p&gt;

</description>
      <category>php</category>
      <category>designpatterns</category>
      <category>eli5</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Short People Problems</title>
      <dc:creator>Jennifer Mackown</dc:creator>
      <pubDate>Fri, 17 Jan 2020 06:35:36 +0000</pubDate>
      <link>https://dev.to/jcmc/short-people-problems-579n</link>
      <guid>https://dev.to/jcmc/short-people-problems-579n</guid>
      <description>&lt;p&gt;As an exactly average height person, I have always struggled in jobs to find a comfortable way to work. Desks are always too high, chairs are too low, monitors never adjust enough… I’ve always had to beg for special stuff like foot rests, adjustable chairs, monitor arms etc so that I could sit comfortably and see things.&lt;/p&gt;

&lt;p&gt;So now I am an official remote only person and have my own home office I finally have the opportunity to actually make a workspace that fits me.&lt;/p&gt;

&lt;p&gt;I would love to take a beautiful photo of my setup but I’m missing a few key parts at the moment, like a monitor. The HDMI port on my work laptop is bust so I’m refusing to buy one til that’s sorted. Also I’m kind of hoping something miraculous will happen and the price of the one I want will fall dramatically in the next few weeks….&lt;/p&gt;

&lt;p&gt;I’ve only bought 2 things so far, but they are arguably the most important things and I spent a LONG time researching so here they are:&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Office Chair for Exactly Average Height People&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I read a lot of articles and ended up deciding on the &lt;a href="https://www.amazon.co.uk/gp/product/B07NYV38DG/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&amp;amp;psc=1"&gt;Sidiz T50&lt;/a&gt;. It’s super adjustable, has customisable lumbar support and has that active leaning back thing that I liked from chairs a few jobs ago. I found that I had to have it at the maximum height when I was using it at my normal desk, so it may not work if you can’t also change the desk height, but it was still super comfy for a full day with a &lt;a href="https://www.amazon.co.uk/Footrest-Density-Ergonomic-Improved-Home-Black/dp/B07RW43C46/ref=sr_1_7?keywords=footrest&amp;amp;qid=1579251616&amp;amp;sr=8-7"&gt;footrest&lt;/a&gt;. The colour matches my walls, both laptops and shitty old monitor, because that kind of thing IS important.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Office Desk for Exactly Average Height People&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I agonised over the desk for a long time. I knew I really wanted a sit/stand desk but wow, they are expensive. I considered the manual &lt;a href="https://www.ikea.com/gb/en/p/skarsta-desk-sit-stand-white-s49084965/"&gt;Skarsta&lt;/a&gt; from Ikea for a while, but it didn’t come in the colour I wanted (it’s my office, dammit!) - I hate white desks. The other important factor was the min height of this desk is 70cm, which is right on the edge of comfortable for me, so there’s a chance that after all that it still wouldn’t be &lt;em&gt;quite&lt;/em&gt; right.&lt;/p&gt;

&lt;p&gt;Then purely by chance I came across a brand of desk in a Reddit thread that I’d never heard of, who are US based but deliver to the UK and just happened to have a sale on, so I just went for it and bought myself an &lt;a href="https://www.autonomous.ai/standing-desks/smartdesk-2-business?option1=1&amp;amp;option2=5&amp;amp;option16=37&amp;amp;option17=41"&gt;Autonomous Smart Desk 2&lt;/a&gt; in walnut and black. It’s min height is 66cm which is nice and low for an Exactly Average Height person. It’s programmable so I can work out exactly what feels right and save it for next time, and it’s very pretty. I also got a cable tray for tidiness and they had a giveaway on as well as the sale so I ended up with a free monitor arm, which will come in handy later. Building was a challenge in my small room, and crikey it’s heavy, but so far omg, totally worth it.&lt;/p&gt;

</description>
      <category>ergonomics</category>
      <category>womenintech</category>
      <category>workspaces</category>
      <category>tips</category>
    </item>
    <item>
      <title>My 'Simple' Life - Morning Routine</title>
      <dc:creator>Jennifer Mackown</dc:creator>
      <pubDate>Wed, 20 Nov 2019 06:35:36 +0000</pubDate>
      <link>https://dev.to/jcmc/my-simple-life-morning-routine-1p7m</link>
      <guid>https://dev.to/jcmc/my-simple-life-morning-routine-1p7m</guid>
      <description>&lt;p&gt;I am a big believer in “work smarter not harder”, hence why I am a programmer - and a Python programmer at that. If I have to do a job more than once you can guarantee there will be a little script for it somewhere. The same works for real life - I have standard routines for anything I find myself doing regularly. Removing thought and decision making from boring everyday tasks &lt;em&gt;in theory&lt;/em&gt; leaves more space for my poor brain to think about more fun and complicated things like optimising SQL and why my photo uploader is giving me a bazillion 500 errors.&lt;/p&gt;

&lt;p&gt;It never occurred to me that this approach was strange til I was reading a thread on Reddit where someone was extolling the virtues of a solid morning routine and I realised that not everyone works this way.&lt;/p&gt;

&lt;p&gt;Given I am about to leave my current job and start an entirely new one, which will be a big change from “must be in the office at 8:30” to working remotely from my ‘office’ I suspect this routine is going to change dramatically, so I am writing it here for posterity :D&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;My Simple Life - Work Morning&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Timing is relative, sometimes I get up at 5:30, sometimes 7 but the basic routine remains the same regardless:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;[evening before] Set up coffee machine (&lt;em&gt;see point 11&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;[evening before] Choose clothes and dump in the spare room&lt;/li&gt;
&lt;li&gt;Kill alarm and get out of bed&lt;/li&gt;
&lt;li&gt;Herd cats downstairs&lt;/li&gt;
&lt;li&gt;Go for a wee, probably with a cat trying to sit on my knee (inconvenient)&lt;/li&gt;
&lt;li&gt;Go feed the cats in the kitchen&lt;/li&gt;
&lt;li&gt;Brush teeth while shower warms up&lt;/li&gt;
&lt;li&gt;Shower (this has a whole routine of its own, which is apparently very weird, but it makes sense to wash things in the same order right? So you know you’ve not missed a bit…? Whatever, it’s what I do)&lt;/li&gt;
&lt;li&gt;Dressed, hairdryer, many hair products&lt;/li&gt;
&lt;li&gt;Back downstairs to kick the cats outside&lt;/li&gt;
&lt;li&gt;Put the coffee on (because I will have inevitably forgotten to set the timer the previous evening)&lt;/li&gt;
&lt;li&gt;Drink a big water and take vitamins (healthy af me)&lt;/li&gt;
&lt;li&gt;Empty dishwasher while coffee is making&lt;/li&gt;
&lt;li&gt;Pour coffee&lt;/li&gt;
&lt;li&gt;Sit on sofa&lt;/li&gt;
&lt;li&gt;Reddit for far too long&lt;/li&gt;
&lt;li&gt;Race to put on coat and shoes and things in bag and omg I can’t find my keys how did that cat get back inside crap I’ve woken up the child…&lt;/li&gt;
&lt;li&gt;Keys are always in the same pocket, they are not lost&lt;/li&gt;
&lt;li&gt;Child needs a hug before I can leave&lt;/li&gt;
&lt;li&gt;Leg it to bus&lt;/li&gt;
&lt;li&gt;Murder podcasts&lt;/li&gt;
&lt;li&gt;Wander to work&lt;/li&gt;
&lt;li&gt;More coffee to get over the drama of the bus&lt;/li&gt;
&lt;li&gt;Bum about chatting til standup&lt;/li&gt;
&lt;li&gt;Breakfast&lt;/li&gt;
&lt;li&gt;Begin useful things&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>productivity</category>
      <category>lifestyle</category>
      <category>tips</category>
    </item>
    <item>
      <title>Things I learnt at FullStack Conf London</title>
      <dc:creator>Jennifer Mackown</dc:creator>
      <pubDate>Fri, 12 Jul 2019 07:03:36 +0000</pubDate>
      <link>https://dev.to/jcmc/things-i-learnt-at-fullstack-conf-london-1cm9</link>
      <guid>https://dev.to/jcmc/things-i-learnt-at-fullstack-conf-london-1cm9</guid>
      <description>&lt;p&gt;Thankfully, not much of the stuff at the conference was new to me - I would be worried for my career if I’d not at least heard about most of this! - but I’ve been working in Python for so long now I’ve not given much brain time over to JS for quite a while, so it’s a nice refresher. A brief overview of things I learnt/found interesting below.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The Main Thread&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A few people have talked about the main thread. It’s not something we’ve had to worry about yet, as most of our heavy lifting is done with Python, and JavaScript is like, 99% UI. However, we have been doing some work on a search function, which could probably be a good test case for using a worker. We’ve also got a couple of calls to external APIs which could be farmed out. I doubt any of this would make a huge performance impact though, as most of our data is pretty static and managed in the back-end, but it’s worth thinking about what we can offload into a background process.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Typescript&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Does anyone actually write JavaScript any more? There has been so much talk of TS around here that I’ve actually started looking at our code to see if we could switch over. There are certain people who dislike the casual nature of Python, so perhaps giving the option of a nice, statically typed version of JS might make things seem better!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a small team it is important to embed security into the development process so you don’t have to think about it. This would definitely be my preferred approach to this stuff, because I know bugger all about it and care even less.&lt;/p&gt;

&lt;p&gt;Some tools to consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://probely.com/"&gt;Probely&lt;/a&gt; - auto security scanner, kind of like a pentest&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://buildkite.com/"&gt;Build Kite&lt;/a&gt; - a Jenkins alternative, because here’s an interesting fact: Jenkins is number 2 on the list of ‘highest number of bug bounty payouts’. Now I’ve had a google and I can’t find a source for this, but the guy said it in his talk so must be true?&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ghostinspector.com/"&gt;Ghost Inspector&lt;/a&gt; - cloud based Selenium alternative?&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sentry.io/welcome/"&gt;Sentry&lt;/a&gt; - Error logging&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.terraform.io/"&gt;Terraform&lt;/a&gt; - infrastructure as code, meaning you can easily roll back to last good configuration if you break stuff&lt;/li&gt;
&lt;li&gt;AWS:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/cloudtrail/"&gt;Cloudtrail&lt;/a&gt; - see which user made what changes&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aws.amazon.com/cloudwatch/"&gt;Cloudwatch&lt;/a&gt; - logging&lt;/li&gt;
&lt;li&gt;[GuardDuty) [&lt;a href="https://aws.amazon.com/guardduty/"&gt;https://aws.amazon.com/guardduty/&lt;/a&gt;) - identifies unusual activity&lt;/li&gt;
&lt;li&gt;Patches - just let AWS do it all, though this has backfired on us in the past&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dependabot.com/"&gt;Dependabot&lt;/a&gt; - automatically keeps your dependencies up to date&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/nccgroup/ScoutSuite"&gt;Scout Suite&lt;/a&gt; - cloud security scanner&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/PyCQA/bandit"&gt;Bandit&lt;/a&gt; - Python OWASP security checked&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://snyk.io/docs/container-security-overview/"&gt;Synk Docker… stuff&lt;/a&gt; - monitors Docker image security considerations&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Good Component Design&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I was expecting this talk to be super React-heavy, like actually designing React components, but actually she was talking about a more general way of designing software which mirrors exactly what I have been banging on about, but more eloquantly.&lt;/p&gt;

&lt;p&gt;Guiding principles of good (component or otherwise) design:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Accessibility, aka “developer ergonomics”

&lt;ul&gt;
&lt;li&gt;Here we mean the developer experience not the user experience, that’s a topic all of it’s own. Your could should be arranged and name logically and sensibly so people can work on it easily.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Scalability

&lt;ul&gt;
&lt;li&gt;Again, developer experience, not scaling the code/server/whatever.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Single Responsibility

&lt;ul&gt;
&lt;li&gt;Makes your code easier to test. Use naming sensibly to help identify which components go together&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Testable

&lt;ul&gt;
&lt;li&gt;Well obvs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;Trivial Examples&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is an issue I have with most conferences, not just this one. Yes, real time autotune in the browser is cool, but it’s not really useful. I either want a deep-dive into the how, what, why etc of the silly thing you made (see (Remy Sharp’s Spectrum](&lt;a href="https://talks.zx.isthe.link/#1"&gt;https://talks.zx.isthe.link/#1&lt;/a&gt;] for a good example) or I want a real world use case. I know it’s hard, especially when speakers have limited time but it gets a little old after a while.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Other interesting bits&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ITP: if your site is only ever rendered in an iframe browsers are starting to block them from reading cookies.&lt;/p&gt;

</description>
      <category>conference</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Diversity in the Tech Industry</title>
      <dc:creator>Jennifer Mackown</dc:creator>
      <pubDate>Mon, 24 Jun 2019 07:03:36 +0000</pubDate>
      <link>https://dev.to/jcmc/diversity-in-the-tech-industry-4bjj</link>
      <guid>https://dev.to/jcmc/diversity-in-the-tech-industry-4bjj</guid>
      <description>&lt;p&gt;&lt;em&gt;I am still figuring out where my opinions are on this topic, as such I reserve the right to contradict myself, change my mind and just generally be wrong throughout this and every subsequent post on the subject.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So I am what is considered “diverse” within the techy industry. This year I have fully taken advantage of my special status and applied for many diversity tickets to conferences, and have been to loads of events I would never have been able to go to otherwise. But every time I apply I feel a little guilty, like I don’t deserve special treatment and a magic free ticket.&lt;/p&gt;

&lt;p&gt;I have justified this to myself by thinking of old me. If you met me now you’d think I’m confident, outgoing, laid back and easy to hang out with (!) but the me of 10 years ago was a very different beast. Due to many circumstances, I was not half the person I am today. I was &lt;em&gt;painfully&lt;/em&gt; shy, wouldn’t go anywhere when I didn’t know people, wouldn’t do anything new. Certainly wouldn’t put myself up for some of the stupid things I’ve done recently. I justify my diversity tickets for old me, because if I did dare to leave the house and go to a conference, seeing people like current me, being all happy and normal there might have helped me out a bit.&lt;/p&gt;

&lt;p&gt;Promoting diversity in tech (and anywhere else) to me is not about going out and looking for the right proportions of “diverse” people to hire/attend your event/be your friends… It’s about creating an atmosphere where all kinds of people are - and &lt;em&gt;feel&lt;/em&gt; - welcome. This does not mean separating ourselves off into thousands of little splinter groups for women in tech, gay women in tech, gay women with nose piercings in tech, gay women with nose piercings and multiple cats in tech… It means creating inclusive events with a sensible code of conduct that is actually enforced when it has to be. I don’t want to go to a meetup for &lt;em&gt;just&lt;/em&gt; queer coders, I want to go to an event for coders, some of which may or may not identify as queer.&lt;/p&gt;

&lt;p&gt;I don’t know. I’m not part of this new generation of people whose entire identity is based around their “otherness”. I’m a whole person. I am interested in many subjects and I have many features - some of which classify as “diverse”. If I want to go to a techy meetup I want to go there to talk about tech with whoever the hell else wants to go and talk about tech. If they happen to be some kind of minority, well good for them. If I wanted to exclusively talk to gay people I’d join a gay meetup group (I have in fact done this, and made some very lovely friends. Other than when they were planning their wedding we very rarely, if ever, talk about our shared gayness.).&lt;/p&gt;

&lt;p&gt;This post, and this opinion is a work in progress.&lt;/p&gt;

</description>
      <category>diversity</category>
      <category>inclusion</category>
      <category>womenintech</category>
    </item>
  </channel>
</rss>
