Let's get to work! - The Lookbook - Engineering Management Consultant
Stephanie Spanjian
Directly consulted with CEO on technical decisions, hiring, and VP of Engineering responsibilities. Collaborated with a cross-functional team of 3 engineers and 1 designer to develop and implement innovative engineering solutions. Assessed technology trends for long-term engineering strategies, positioning the company for scalability during the user acceptance testing (UAT) phase. Coed demographic means security, performance and site reliability.
Architecture V2 - Backend:
Single-handedly without interrupting feature development, refactored API into latest GraphQL and TypeScript, utilizing ECMAScript Modules (ESM) with strict typing and a true GraphQL schema. Ensured schema and type errors failed on transpiling and pre-git-commit husky check with strict ESLint and prettier configuration. Removed 50% of unused or unnecessary code left over from business logic pivots and an incomplete refactor from JavaScript RESTful API to untyped TypeScript GraphQL API. Broke initiative into deliverables as Architecture V1 Jira Epic with stories and tasks. Decreased feature development LOE by over 50%. Improved CodeFactor grade from C- to B with application-level work. Delegated rest of Epic to team.
Applied DRY and S.O.L.I.D principles with proper design patterns and data types. Used proper casing and naming conventions. Replaced CRUD REST with Queries and Mutations during upgrade of packages (e.g., GraphQL, Apollo Server, and Mongo) which were 2 versions behind. Replaced strings with enums. Removed all unused dependencies.
Built application level Sentry service for bug tracking, tracing and performance evaluation on all environments. With new enums, easy to only track critical errors.
Protected code quality with Code Factor Github automation on develop to catch problems prior to Production Releases.
Crafted singleton Mongodb client service to replace multiple clients. Enum of collection names ensured proper typing and error handling.
Refactored authentication resolver to use actual request origin domains before sending cookies in the response.
Employed Jest with SuperTest. Generated smoke test, auth test, test on all front page queries and mutations, and enacted test plan to delegate.
Architecture V2 - Fullstack & Devops:
Reviewed and provided recommendations on software architecture, end-user security and authorization, development operations (DevOps) practices and tools, as well as best practices in front-end and back-end development. Implemented automated process improvement initiatives to streamline continuous integration and continuous deployment (CI/CD) processes.
Generated Jira tickets based on top suggestions from regular Lighthouse runs and key Code Factor suggestions.
Conducted comprehensive code reviews to hold team to high standard.
Authored detailed architecture and CI/CD documentation in Atlassian Confluence.
Provided guidance and expertise for the purpose of identifying and analyzing business needs, (e.g. reset password feature)
"Stephanie and I worked together on a project where she provided consulting services as a senior engineer. Her expertise in Typescript and NodeJs was obvious and for us it meant a great deal of successful refactoring and code improvements, which was no easy job.
I would also add that Stephanie is a great team player, always approachable and willing to help. She takes the initiative and constantly overachieves, taking charge when necessary and ensuring tasks are completed efficiently. She’s not afraid to do the heavy lifting. Not to mention, her extensive work experience comes with great attention to detail and thoroughness. This in particular helped us catch a lot of potential issues and bugs, which is always a big plus. All in all, her technical proficiency and dedication to producing great results make her an asset to any team."
API: in one month:
Switched only GitHub repo using npm to yarn for consistency and updated README.md to reflect this.
Tightened up ESLINT rules in eslint config and removed ones for front end and fixed all associated errors from the tighter rules.
Tightened up prettier rules in prettierrc and set semi to false to reduce size of codebase and fixed all associated errors from the tighter rules.
Updated TypeScript target from ES2016 to ES2021 and set noImplicitAny to true and fixed all any type errors.
Added packages: eslint, prettier and necessary plugins.
Added lint and prettify to package.json scripts:
"lint": "eslint . --fix"
"prettify": "yarn prettier --write ."
Added engines and lint-staged to package.json so that git precommit would run locally before allowing git committing to repo.
Removed unused fire base packages and unused service account file.
Added eslint no console rule to eliminate the large amount of console logging that was blowing up the console with crap and only allowing logger.info if helpful like server started...
Removed code that caused logger to write to console literally everything that blew up console with unreadable unnecessary logging.
Removed unused app.js file.
Since so many issues, had to set some to warn first then increment to error... no unreachable code, no unused vars, no var requires
Added types packages like @types/cors, @types/jsonwebtoken...
Removed setting threading events to infinity! No need after typing the code to actually return a promise.
TYPING to remove type errors, matching resolver function signatures with GraphQL typedefs so schema is correct
Removed duplicate functions like one getDisbursedEarnings was misspelled and there were two versions.
Types in folder instead of repeated in code over and over.
Renamed queries to use verbs not nouns, like activeCompensation to getActiveCompensation and uploadsSearch to searchUploads, user to getUser...
upgrade to ESM: tsconfig upgrade module from commonjs to ES2022, package type to module and updated all packages which some were several versions behind like mongo from 3.3.3 to 5.50, and main upgrade was apollo-server 2.16.1 to @apollo/server 4.7.1 and GraphQL from 14.7.0 to 16.6.0, main index to index.mts, upgraded to use new GraphQLError method instead of various deprecated methods,
Fixed incorrect typeDefs, resolvers to use correct types: Query and Mutation, created a schema file that imports typeDefs and Resolvers to be exported from one place to main index.mts, and so now the code won't transpile if any schema errors.
Added Sentry bug tracking system with environment variables for 3 environments for bug tracking and added a few custom errors that used GraphQLError extension.code to not track in Sentry but still need to be surfaced to consumer of api. Like forbidden, auth errors, 404, etc.
Created a singleton Mongodbclient service to live in new services folder with Sentry service, because there were multiple ones, MongoError instead of plain Error for better tracking, collection names all in enum instead of inline all over code, so list of actual collections in one place.
Removed tons of duplicate functions and used Request, Response, etc types from express for resolver functions.
Once collections in an enum, easy to get team feedback on which to delete. Deleted analytics because no need, notifications because needs to be completely rethought to use GraphQL subscriptions instead of polling constantly and since schema would barf if incorrect it was now safe to remove aggregations that are not necessary if using GraphQL. Like getCategoriesAndBrands, etc.
Refactored auth resolver to utilize the actual domains and check admin role before sending cookies to admin next.js app.
Admin repo:
Updated packages so no dependency mismatch in console. THERE WERE TWO TYPES OF TYPESCRIPT: ONE IN DEPENDENCIES AND ONE IN DEV DEPENDENCIES! Other packages were in both, also, but TypeScript is huge problem but tailwinds in both will cause bugs because mismatching versions...
Removed unnecessary plugin because in main tailwind package now after upgrade.
Front End Member app repo:
tightened up eslint so no unreachable code, no unused vars and fixed errors from this and removed lots of eslint-disable...
upgrade to ESM: tsconfig upgrade module from commonjs to ESnext, package type to module and updated all packages which some were several versions behind like "@types/node" from 17.0.35 to 20.2.3, and main upgrade was storybook to 7.0.17
Upgraded Storybook main.js to TypeScript main.ts
Implemented basic Sentry and swapped out console log and console.errors to be tracked in sentry