|
1 | | -import React from 'react'; |
2 | | -import logo from './logo.svg'; |
3 | | -import './App.css'; |
| 1 | +import React from "react"; |
| 2 | +import styled from "styled-components"; |
| 3 | +import { Container, Row, Col, Badge, ListGroup } from "react-bootstrap"; |
4 | 4 |
|
5 | | -function App() { |
| 5 | +// import logo from './logo.svg'; |
| 6 | +import "./App.css"; |
| 7 | + |
| 8 | +const PillGroup = styled(ListGroup).attrs({ |
| 9 | + horizontal: true, |
| 10 | + className: "d-flex flex-wrap" |
| 11 | +})``; |
| 12 | + |
| 13 | +const Pill = styled(ListGroup.Item).attrs({ |
| 14 | + as: Badge, |
| 15 | + variant: "secondary" |
| 16 | +})` |
| 17 | + margin: 1px; |
| 18 | + // font-weight: lighter; |
| 19 | + border-color: #6c757d; |
| 20 | +`; |
| 21 | + |
| 22 | +const Title = styled.h1.attrs({ |
| 23 | + className: "mt-2" |
| 24 | +})``; |
| 25 | + |
| 26 | +const SubTitle = styled.h2.attrs({ |
| 27 | + className: "mt-3" |
| 28 | +})``; |
| 29 | + |
| 30 | +const Summary = styled.p.attrs({ |
| 31 | + className: "mb-1" |
| 32 | +})``; |
| 33 | + |
| 34 | +const Company = ({ name, location }) => ( |
| 35 | + <Row> |
| 36 | + <Col as="h3" className="mb-0"> |
| 37 | + {name} |
| 38 | + </Col> |
| 39 | + <Col as="h5" className="mb-0" xs="auto"> |
| 40 | + {location} |
| 41 | + </Col> |
| 42 | + </Row> |
| 43 | +); |
| 44 | + |
| 45 | +const Position = ({ title, time, duties }) => ( |
| 46 | + <> |
| 47 | + <Row> |
| 48 | + <Col as="h4" className="my-2"> |
| 49 | + {title} |
| 50 | + </Col> |
| 51 | + <Col as="h5" className="my-2" xs="auto"> |
| 52 | + {time} |
| 53 | + </Col> |
| 54 | + </Row> |
| 55 | + <ul className="pl-3 mt-0 mb-2"> |
| 56 | + {duties.map((duty, index) => ( |
| 57 | + <li key={`${title}-${index}`}>{duty}</li> |
| 58 | + ))} |
| 59 | + </ul> |
| 60 | + </> |
| 61 | +); |
| 62 | + |
| 63 | +const Pills = ({ title, list }) => ( |
| 64 | + <> |
| 65 | + <SubTitle>{title}</SubTitle> |
| 66 | + <PillGroup> |
| 67 | + {list.map((listItem, index) => ( |
| 68 | + <Pill key={`${title}-${index}`}>{listItem}</Pill> |
| 69 | + ))} |
| 70 | + </PillGroup> |
| 71 | + </> |
| 72 | +); |
| 73 | + |
| 74 | +const SideList = ({ title, list }) => ( |
| 75 | + <> |
| 76 | + <SubTitle>{title}</SubTitle> |
| 77 | + <ul className="list-unstyled p-0 m-0"> |
| 78 | + {list.map((item, index) => ( |
| 79 | + <li key={`${title}-${index}`}>{item}</li> |
| 80 | + ))} |
| 81 | + </ul> |
| 82 | + </> |
| 83 | +); |
| 84 | + |
| 85 | +const ExperienceList = styled(ListGroup).attrs({ variant: "flush" })``; |
| 86 | +const Experience = styled(ListGroup.Item).attrs({ className: "pl-0" })``; |
| 87 | + |
| 88 | +export default function App() { |
6 | 89 | return ( |
7 | | - <div className="App"> |
8 | | - <header className="App-header"> |
9 | | - <img src={logo} className="App-logo" alt="logo" /> |
10 | | - <p> |
11 | | - Edit <code>src/App.tsx</code> and save to reload. |
12 | | - </p> |
13 | | - <a |
14 | | - className="App-link" |
15 | | - href="https://reactjs.org" |
16 | | - target="_blank" |
17 | | - rel="noopener noreferrer" |
18 | | - > |
19 | | - Learn React |
20 | | - </a> |
21 | | - </header> |
22 | | - </div> |
| 90 | + <Container className="pt-5"> |
| 91 | + <Row> |
| 92 | + <Col> |
| 93 | + <Title>Mackenzie Browne</Title> |
| 94 | + <Summary> |
| 95 | + Product-focused nerd with 10 years industry experience. |
| 96 | + Professional, organized lifelong learner motivated by difficult and |
| 97 | + interesting challenges. Self-driven, enthusiastic and love working |
| 98 | + both independently and with teams. Uses a curated collection of |
| 99 | + libraries and automation tools to make development / testing / |
| 100 | + deployment as efficient as possible. |
| 101 | + </Summary> |
| 102 | + </Col> |
| 103 | + </Row> |
| 104 | + <Row> |
| 105 | + <Col> |
| 106 | + <SubTitle>Experience</SubTitle> |
| 107 | + <ExperienceList> |
| 108 | + <Experience> |
| 109 | + <Company name="Elsevier" location="Amsterdam" /> |
| 110 | + <Position |
| 111 | + title="Senior Full Stack Developer - Scopus Core Team" |
| 112 | + time="Feb 2020 - Present" |
| 113 | + duties={[ |
| 114 | + "Building a full design system and shared component library to unify the look and feel of all Scopus Products", |
| 115 | + "Involvement in major web stack migration to microservices and modern front-end technologies.", |
| 116 | + "Mentoring and 1 on 1's for junior / intermediate developers.", |
| 117 | + "Performing technical and cultural interviews to grow the team." |
| 118 | + ]} |
| 119 | + /> |
| 120 | + </Experience> |
| 121 | + <Experience> |
| 122 | + <Company name="Prodigy" location="Toronto" /> |
| 123 | + <Position |
| 124 | + title="Lead Mobile Application Developer - Game" |
| 125 | + time="Mar 2019 – Sep 2019" |
| 126 | + duties={[ |
| 127 | + "Improve the mobile app development and quality assurance experience by developing tools that improve the efficiency of internal teams.", |
| 128 | + "Improve user experience by building mobile-specific features as well as improving any mobile usability issues and bugs.", |
| 129 | + "Configure automation pipelines for QA, builds and deployment.", |
| 130 | + "Facilitate cross-team collaboration to improve the mobile experience in all parts of the app.", |
| 131 | + "Code mentor for several junior developers in the company." |
| 132 | + ]} |
| 133 | + /> |
| 134 | + <Position |
| 135 | + title="Senior Full Stack Developer - School Leader App" |
| 136 | + time="Jun 2018 – Mar 2019" |
| 137 | + duties={[ |
| 138 | + "Full Stack Development using React, Node and GraphQL", |
| 139 | + "Primary role is to develop new features and improve the Admin/Principal user experience.", |
| 140 | + "Create user management system to remove and invite new uses to an Principal's school", |
| 141 | + "Develop several in-house tools to improve productivity and integrate Github and CI communication through slack." |
| 142 | + ]} |
| 143 | + /> |
| 144 | + </Experience> |
| 145 | + <Experience> |
| 146 | + <Company name="Novus Health" location="Toronto" /> |
| 147 | + <Position |
| 148 | + title="Senior Frontend Developer" |
| 149 | + time="Oct 2017 – Jun 2018" |
| 150 | + duties={[ |
| 151 | + "Support and maintain the existing Novus platform app. Includes a user-facing website and a supporting content management system.", |
| 152 | + "Designed and implemented a standardized method to building apps that can be reproduced for projects going forward. This dramatically reduced the amount of bugs and support needed to keep software running long-term.", |
| 153 | + "Create new internal company app with data analytics, multiple sign-in routes and dynamic navigation features.", |
| 154 | + "Help develop skills of interns and other employees on the team with pair programming and code reviews on each submission.", |
| 155 | + 'Promote extra curricular coding activities like running a team "Advent Of Code" scoreboard.' |
| 156 | + ]} |
| 157 | + /> |
| 158 | + </Experience> |
| 159 | + {/* <Experience> |
| 160 | + <Company name="Bonsai" location="Toronto" /> |
| 161 | + <Position |
| 162 | + title="Development Team Lead" |
| 163 | + time="Apr 2017 – Sep 2017" |
| 164 | + duties={[ |
| 165 | + "Hire and Lead team of 8 developers", |
| 166 | + "Build custom e-commerce ios / android hybrid app", |
| 167 | + "Build a supporting CMS back-end to support the customer-facing app", |
| 168 | + "Setup agile team development practices", |
| 169 | + "Setup continuous integration with unit testing", |
| 170 | + "Gather and refine specifications and requirements based on technical needs" |
| 171 | + ]} |
| 172 | + /> |
| 173 | + </Experience> */} |
| 174 | + <Experience> |
| 175 | + <Company |
| 176 | + name="Self Employed (9274022 Canada Inc.)" |
| 177 | + location="Canada, USA (On-Site and Remote)" |
| 178 | + /> |
| 179 | + <Position |
| 180 | + title="Freelance Full Stack and Mobile Developer" |
| 181 | + time="August 2011 – June 2017" |
| 182 | + duties={[ |
| 183 | + "Full-time contracting including initial pitch meetings all the way through to final product.", |
| 184 | + "Perform interviews and hiring to advice how companies should hire their teams", |
| 185 | + "Requirements gathering, design, proof of concept and mvp implementations.", |
| 186 | + "Perform upgrades, maintinence or build new features to existing products.", |
| 187 | + "Built Mobile Apps, Websites and Hardware projects involving GPS and Bluetooth", |
| 188 | + "Clients included IBM, NYPD, Syfy/Space Channel, NBC, Hatch, and many small startups, nonprofits and charities in the Toronto area" |
| 189 | + ]} |
| 190 | + /> |
| 191 | + </Experience> |
| 192 | + </ExperienceList> |
| 193 | + </Col> |
| 194 | + <Col md={3}> |
| 195 | + <SideList |
| 196 | + title="Contact" |
| 197 | + list={[ |
| 198 | + "info@mackbrowne.com", |
| 199 | + "+31 061 773 5900", |
| 200 | + "linkedin.com/in/mackbrowne" |
| 201 | + ]} |
| 202 | + /> |
| 203 | + <SideList |
| 204 | + title="Portfolio" |
| 205 | + list={["mackbrowne.com", "github.com/mackbrowne"]} |
| 206 | + /> |
| 207 | + <SideList |
| 208 | + title="Skills" |
| 209 | + list={[ |
| 210 | + "Beautiful customer-facing pages", |
| 211 | + "Responsive Design", |
| 212 | + "Agile and Kanban Methodology", |
| 213 | + "Git Flow", |
| 214 | + "Unit and E2E Testing", |
| 215 | + "Continuous Builds / Tests / Deploys", |
| 216 | + "Native and Hybrid App Development", |
| 217 | + "Single Page Apps", |
| 218 | + "REST API Development" |
| 219 | + ]} |
| 220 | + /> |
| 221 | + <Pills |
| 222 | + title="Frameworks" |
| 223 | + list={[ |
| 224 | + "ReactJS", |
| 225 | + "Hooks / Context", |
| 226 | + "Redux", |
| 227 | + "Styled-Components", |
| 228 | + "Jest", |
| 229 | + "Cypress", |
| 230 | + "NodeJS", |
| 231 | + "Typescript", |
| 232 | + "GraphQL", |
| 233 | + "Bootstrap", |
| 234 | + "React-Native", |
| 235 | + "Expo", |
| 236 | + "Cordova", |
| 237 | + "MeteorJS", |
| 238 | + "Angular" |
| 239 | + ]} |
| 240 | + /> |
| 241 | + <Pills |
| 242 | + title="Services" |
| 243 | + list={[ |
| 244 | + "AWS", |
| 245 | + "Firebase", |
| 246 | + "JIRA", |
| 247 | + "CircleCI", |
| 248 | + "Google Play", |
| 249 | + "Itunes Connect", |
| 250 | + "Stripe", |
| 251 | + "Maps", |
| 252 | + "OAuth" |
| 253 | + ]} |
| 254 | + /> |
| 255 | + <Pills |
| 256 | + title="Tools" |
| 257 | + list={[ |
| 258 | + "Git", |
| 259 | + "VSCode", |
| 260 | + "Jenkins", |
| 261 | + "Vim", |
| 262 | + "Eslint", |
| 263 | + "Prettier", |
| 264 | + "cloc" |
| 265 | + ]} |
| 266 | + /> |
| 267 | + </Col> |
| 268 | + </Row> |
| 269 | + </Container> |
23 | 270 | ); |
24 | 271 | } |
25 | | - |
26 | | -export default App; |
|
0 commit comments