Essential Competencies of a Fullstack Software Developer Matrix

Source

Post

Technologies around JS


CoderProgrammerEngineerGuru
HTMLOwns the modern layout and most common APIsIn the course of the reflow / repaint cycle. Uses HTML5 tags for the most semantic layout. Pre-use HTML5 APIs including for graceful degradation / progressive enhancement. Owns microformats / micro-labeledFollowing new trends in the world of HTML ( example – web components ). Applies them or does not apply on the project depending on the business value of the solutionsThe gurus of the ( layout will understand if you have met such ). He knows the features of the functioning of HTML5 APIs in different browsers under different conditions.
CssStandard CSS3Knows non-standard ( non-obvious ) CSS shirtsMonitors the development of CSS and can-i-use. It is meticulously devoting time to supporting CSS in supported projects (long live tautology!). Has an opinion about CSS-in-JS and why it (not) should be used in specific projectsthoroughly knows the nuances of rendering entities in different browsers. Writes the perfect CSS, which is understandable to the team and covers all the needs of the project
JavaScriptOwns the main language constructions, basic concepts (a la closing, etc.)He knows how to write clear and flexible code. Avoid the use of “hacks” and “specialties” of the language without necessity.Understands the features of JavaScript on different engines and on different devices. Monitors TC39 and the development of the language, has his opinion on future improvements and their feasibilityHe takes an active part in the development of one of the main JavaScript engines
TypizationNo idea about typing codeAble to write code with types ( typing system is not important). Understands the points of the code where runtime-typization is neededThinks of types as an effective tool for describing a domain area. It puts the types at the core of the design process, even if it does not use static typing systemsIt uses all the expressive capabilities of the typing system, knows its weaknesses, uses code generation to bypass poorly digitized places, redesigns the code so that the maximum amount of code is covered by the minimum capabilities of the typing system. Types form an integral part of the system contract
System Programming BasicsNot interested in system programmingDiffers the compiler from the linker, and the interpreter from the compiler. Able to find out the cause of the compilation error of the next node_modules and eliminate itAble code can be read (including those generated v8)Able to write (or wrote) your own kernel modules or low-level utilities for solving complex problems
FramvorkyAble to solve typical problems within the framework of a ‘favorite’ framework. He understands well where and how to writeIt is able to implement complex solutions that go beyond typical tasks and choose the components of the stack depending on the task. It makes maximum use of the features provided by frameworkers so as not to reinvent the bike. Realizes the weaknesses of the framework and writes code to minimize their negative impact.Understands the internal organization of the framework. Able to write code that maximally uses the features of internal implementation. He knows the poorly documented or unobvious possibilities of the framework, is able to predict errors by looking at the code before starting 🙂It is able to expand the framework at the ‘core’ level for non-standard tasks (for example, changing the reconciliation algorithm in React to optimize the output of ‘video blocks’ in the ‘video cloud’).
Enemy technologyConsiders the selected stack “the best”. Negatively refers to “prites” in another languageAble to objectively state the strengths of “enemy technologies”Actively borrows effective solutions from wherever possibleHe has commercial experience in every technology that is aggressively criticized. He regularly experiments with “enemy” technologies in order to be “in the subject” and to realize his work as efficiently as possible

Computer science and related things

CoderProgrammerEngineerGuru
Algorithms and data structuresHe knows about the existence of recursion, bubble sorting and quick sorting.He knows about the existence of O-big, knows the complexity estimates of most ‘classical’ algorithms for ‘classic’ data structures (list, array, etc. down to AWL trees), is able to implement these algorithms, having a description from the sheetAble to prove complexity estimates by time and memory for unfamiliar algorithms. It is able to optimally select the data structure to solve the problem. He knows how to optimize algorithms within the specified conditions (including the search for approximate solutions)Understands weighted matroids and other horrors for a rigorous mathematical assessment of not only maximum and average time-memory estimates, but also for estimating metrics ‘95% should fit in X ms’
Design patternsOwns basic design patterns: Observer, Singleton, Event bus, Factory, etc.Consciously or unconsciously owns most of the current design patterns from the ‘Band of Four’It is able to select implicit design templates as part of a review of an existing code or crop code, make them explicit and convey the light of design patterns to the code authorSees ‘Matrix’ – almost any task is able to effectively decompose to subtasks within the framework of well-known design patterns
OOPKnows the ‘three whales’ of the OOP and is able to see them in the codeKnows SOLID principles and practices themRespects Domain Driven Design and designs systems for the real world. He knows the weaknesses of the PLO and goes around themCombines the OOP and functional style so that it leads to the most understandable and supported code
Functional programmingHe knows what ‘clean functions’ are’. Used map / filter / reduce. Secretly does not respect those who bypass the arrays forUnderstands Observable’s and other flows and uses them effectivelyHe knows what ‘monades’ are’. Can write in the functional style of places that are effectively expressed in the functional styleCombines the OOP and functional style so that it leads to the most understandable and supported code
ArchitectureThoughts on the architecture of the application at the current file / module levelPlans the architecture of the application based on best practices accepted in programming. Able to lay the competent architecture of the projectIt develops the architecture of the application based on business needs, available resources, scaling potential and (for what they forget) the technical skills, capabilities and expertise of the team that will develop the projectHe has practical experience in solving problems in certain architectures. Designs as simple as possible, but not easier than business needs.

IT skills


It is able to expand existing tools (own webpack and ball-plugins, for example). Develops tools for solving problems within the existing project and for business needsProgrammerEngineerGuru
Continuous integrationIs a ‘consumer’ of Continuous Integration. Able to write code that not only ‘is everything working for me’, but also passes tests on CIUnderstands the principles of CI, able to understand the problems with the CI billAble to raise complex CI from scratch on an existing project. He knows the weaknesses of CI processes and how to get around them.Develops new tools for continuous integration aimed at solving specific pain of the company and project
DeploymentAble to wrap an existing project in a Docker container and run itOwns the principles of building 12-factor applications. Able to implement a structure of several containers (docker-compose) and effectively support several working environmentsOwns configuration management systems at a minimum (Chef, Ansible). Understands and has management experience with Kubernetes or similar systems, is able to solve the problems of zero-time deployment and write code taking into account such needsAble to perform all DevOps functions, including deploying, supporting, and scaling complex clusters
Version controlKnows standard git flowSkills to use git to maximize the expressiveness of history: interactive rebase, partial commits, etc.Owns advanced features: git rerere, worktree, etc. Applies them in everyday activities for the benefit of the projectUnderstands how storage of objects in git is organized, including git-lfs. Able to restore an almost hopelessly damaged tree, sometimes with self-painted scripts
OSHe knows the OS at the level of a confident user. Able to reinstall its working system and solve typical problems in itHe understands how the process of loading the OS, initializing the services is arranged. He understands the principles of loading system libraries into memory, is able to make changes to the working system and, in which case, restore the system after failures without reinstalling.Understands the architecture of the ( OS for example for linux: understands how systemd works at all levels ). Uses the capabilities of the OS to implement tasks that go beyond the core functionality of the ( application, for example, environmental insulating, data transfer speed control, etc. )Owns a deep understanding of the OS. He understands the features of the kernel and specific system calls on a particular iron. Able to deeply debug problems, up to the use of tools for profiling system calls in the core and debugging the kernel itself
Network protocolsAble to tell ‘What happens when you type www.google.com’ in a browser’. Understands how TCP / IP, UDP, WebSockets work, but nothing moreUnderstands the entire OSI model. Skills to use tools (wireshark), is capable (for example) of intercepting and debugging an encrypted HTTPS connectionHe knows the weaknesses of existing protocols and encountered them. It understands the nature of delays in data transfer at all levels (from downloading data to a network map to the features of package routing delays). Able, for example, to write your parser protocol for wireshark or use other, more perverted methods of debuggingUnderstands the specifics of package processing at all levels, including hardware. Is able to optimize the configuration of the + OS environment + product to achieve optimal network stack performance at all three levels
DatabasesDistinguishes MySQL from MongoDB. Able to write a request with jaws or nested selects. He knows what 3 normal forms of database are not only during an interviewOwns a request profiler. It understands when it is worth using relational, when document-oriented databases. He knows when to retreat from normal formsHe has experience with exotic databases – exotic configurations or exotic engines. At least once he stumbled into the limitations of the engine and heroically raked them. Able to write effective queries and quickly identify ineffective ones. Able to indicate the most problematic places in future scalingHas practical experience in all ‘direction’ databases. He has practical experience of horizontal and vertical scaling, data recovery, knows the specifics of storage engines, features of the work of query profilers, etc.
ToolsKnows and uses the most popular tools (webpack, label, etc.). Able to make minor configuration changesIt is able to fully configure related tools (example – webpack config for dev + prod + ssr + hmr). He knows about alternative tools. Able to select a tool for a specific taskIt is able to expand existing tools (own webpack and balel-nlagins, for example). Develops tools for solving problems within the existing project and for business needsIt develops tools that are used not only in the internal processes of the team, but also significantly – beyond its borders.
PlatformEngaged in the development of application onlyUnderstands which ‘platform’ the application is running (starting from nginx / lighttpd front for node.js application and ending with using Cloudflare for the front). Knows about the features of the platformAble to analyze the existing platform, make suggestions for its improvement and implement these improvementsDeep immersed in the nuances of a particular platform. Promises improvements to it (both aimed at a specific project and in a public domain)

Fullstack Developer Tattoos

CoderProgrammerEngineerGuru
LoggingWrites logs using console.log or fileHe understands why centralized logic tools are needed. He writes systems taking into account the possibility of a dynamic change in the level of logs in order to study the problem of ‘live’ in the production.Refers to logic as a fundamental tool for retrospective analysis. Accurately affixes logic levels, clearly structures logs, marks logs so that it is possible to trace the history of, say, a specific query through a series of microservicesHe writes tools for isolating patterns from logs (sometimes using machine learning and other fashionable words). Builds on top of ‘raw’ logs higher-level monitoring and early warning systems
CachingDo not think about caching. If necessary, uses naive cache in memory / redisHe understands that a joke about two problems in programming is not a joke at all. Thinking about strategies for disabled cache, understands the principles of eventual consistencyAble to implement a caching strategy in a project from scratch. It is able to implement caching in complex scalable systems (including geographically scaled, including fault-tolerant). He knows the features of the functioning of those caching technologies that are used in the production of a particular project.He understands the cache of all levels (starting from L1 and ending with external cache in the services). Skills to identify problems associated with caching and optimize the structure to achieve maximum productivity
FailoverDo not think about fault tolerance of applicationsUses pm2 and / or docker or something else to implement ‘reference stability’. He knows about transactions and that all operations with money must be performed in them.He understands the failures in which elements of the system lead to maximum risks for the business and develops a fault tolerance strategy based on this understanding.In the course of modern fault tolerance trends. He knows the existing scenarios of failure of the systems used (example of MongoDB) in real projects and owns strategies to protect against such failures. Takes fault tolerance as a property of the entire system, not a specific software product
ScalingNo idea about scaling applicationsHe knows what horizontal scaling is. Able to write code, taking into account such scenariosIn the course of vertical and horizontal scaling. Has practical experience in building complex scalable systems.It is able to implement scaling into an existing complex project (starting from changes in code and ending with DevOps tasks, while it is not necessary to carry out everything independently). Understands the limitations of scaling, the risks involved and the metrics that need to be tracked.
ProductivityHe knows exactly what is faster – for or .forEach. Writes code based on this (and similar) knowledgeUnderstands Knut’s first rule. It is able to refuse microoptimizations towards the readability of the code, however, it is conceived about performance in the context of functions and modulesIt makes decisions about optimizing performance only based on code profiling. It is able to assess the benefits of optimization before its implementation, and refuse in case of a non-optimal ratio of ‘benefit – costs’It is able to identify performance problems before they get into production and become really problems. Owns advanced tools for analyzing productivity, and in the case of complex scenarios (some of the clients are slowing down and it is not clear why) – able to put forward theories and develop tools to test these theories
SSRDid not implement SSRAble to implement SSR on standard platforms, understands the nuances of programming such systemsAble to implement SSR from scratch to achieve optimal performance. Understands technology weaknessesAble to solve near-SSR problems with non-standard approaches specific and applicable only for a particular project
Authentication / AuthorizationAble to implement standard authorization login password-reduction-registrationUnderstands how OAuth2 and JWT work. Able to implement them safelyOwns the nuances of 2FA and existing attacks on them. Able to build complex role systemsFully owns the theme of AAA ( Authorization, Authentication, Accounting ). Able to find potential security threats, data leakage problems, etc.
Information SecurityNot thinking about information securityFamiliar with top10 OWASP and presents how to defend against themKnows about exotic attack vectors, tracks relevant 0-day vulnerabilities. Understands sections of the system with increased risk ( for example DDOS )Writes tools for conducting attacks and identifying problem areas (for example, for Metasploit)
UX / DXNot interested in UX / DX issuesInterested in UX, heard something about DX, but never did itCollects metrics to improve UX. Actively collects feedback on the use of module-libraries-components of DX improvement modulesHas his vision of UX / DX. It is able to contrast its opinion with the opinion of the majority, if this contributes to the solution of goals

Soft skills

CoderProgrammerEngineerGuru
Self-relianceAble to provide a report on a task when askedProactively warns of potential problems, requests help and so onHe is able to independently set himself tasks for a long time, only by coordinating vision with ‘architectors’ and ‘product owners’Has a clear understanding of the priorities of tasks in terms of development. He listens to priorities from the point of view of business, is able to provide ‘heroic’ efforts (deliveries in a limited time) not by overpower of the team, but by jointly simplifying tasks, etc.
TeamworkTakes the team as a ‘tool’ for advice, feedback, training materials and so onActively shares with the team the knowledge and important ‘gotcha’ in the process of working on the project. Takes the team as a source of resources for continuous improvementAble to fulfill (temporarily or on an ongoing basis) the role of leader in a team. Owns the concepts of emotional intelligence and takes it into account to unite the teamTakes command as a whole. It makes efforts to achieve a synergistic effect. Knows the strengths and weaknesses of each team member.
MentoringNot interested in mentoring issuesAble to answer questions about the project / technology. Able to share his knowledge, in the format ‘here you need to do wrong’Able to effectively train a small group of employeesAble to convey knowledge to an indefinite wide range of people. Owns the skills of psychology-pedagogy-group dynamics for the most effective mentoring
Interviewing SkillInterview perceives as a ‘almost exam’He is able to discuss existing projects and his role in them at an interview. Able to critically evaluate previous experienceIt perceives questions at interviews not as tasks that have the only right solution. In solving complex issues, it is proactive, not afraid to recognize ‘I don’t know’, but at the same time reasoning “Let’s think together”’Interviews do not pass, and if they pass, they take the form of conversations for life or retrospectives of their activities
Out-of-the-box thinkingThinking ‘intuitive’ based on your own experience and freshly read materialsFamiliar with typical approaches and uses them. Able to find an alternative solution in case of serious problemsIt is able to make decisions that at first glance contradict generally accepted approaches, however, allowing to effectively solve the task within the framework of current restrictionsFormalizes the principles of its solutions and sets them out ( publicly, inside the team – it doesn’t matter ). Promotes the transition of new ‘unique’ solutions to the category of well-known and generally accepted
EnglishAble to read technical documentationCorrect written English and tolerable conversationalFree conversational English ( technical contexts )Free conversational English
CommunicationsRarely initiates communications. Most communications are either related to solving ‘excellent’ problems, or within the framework of the current regulations ( shandapas, retrospectives, etc. )It distinguishes communications as problems arise in current tasks. It is able to oppose other developers, including higher ones, if I am confident in my arguments. Monitors communication results in the context of specific actionsIt uses an engineering approach in communication – communications are used as an effective tool for achieving goals. In work processes, there are completely no communications that do not contribute to the achievement of specific goals.He possesses the concepts of emotional intelligence, the basic principles of NLP and everything that can help in building communication with ‘complex’ people. Communication is built on the basis of not only business goals, but also the psychological characteristics of the other side in communication
Vision ( vision )He is interested only in the tasks set. Does what is orderedHe is interested in the tasks of the team, asks questions “why is it necessary from the point of view of business”, is able to offer alternative solutions to the problem if the current setting of the problem leads to significant difficulties or risksHe is interested in the business specificity of projects and their development directions. Based on personal experience, it is able to predict tasks, team requests and needsIt is able to formalize vision in process documents so that a priori knowledge becomes formalized. He understands the problems of business and does everything possible to ensure that the development of ( as service personnel ) is as consistent as possible with business needs
Reading skills of someone else’s codeReading someone else’s code is associated with shouting ‘Who writes like that?’, ‘Why so?’, ‘what the $ # $ R@!’Able to accept the ‘point of view’ of another programmer and, if necessary, ask questions about problem placesEvaluates someone else’s code exclusively purely in terms of criteria, important for the project in the current context (for example, as part of an urgent release, it is permissible to freeze the code written not gracefully from the point of view of architecture and having problems with productivity). Not trying to impose their approaches on everyoneIt perceives someone else’s code primarily as an opportunity to study the approaches of other people. Able to critically perceive your own code and ‘bend down’ to team decisions (given team level)

General IT Competencies


CoderProgrammerEngineerGuru
DebuggingAble to debug code using console.log and debuggerUses all the features provided by the environment (conditional breakpoints, xhr breakpoints and so on)It is able to efficiently and quickly debug complex interactions ( asynchronous operations, the interaction between processes and so on ). For Node.JS, it can debug native modulesAble to effectively debug the core of the system ( JavaScript )
RefactoringA spontaneous approach to code improvements based on personal sensationsRefactoring is based on “generally accepted” best practices and is carried out as necessary.Evaluates refactoring as a business activity, makes decisions on refactoring based primarily on the potential benefit of the project in the context of current business goalsThe refactoring practically does not distinguish in a separate activity, however, the refactoring process itself occurs continuously – on the one hand there are many changes, on the other hand they arise in the system gradually, so the team does not lose the ‘nit’ happening in the system
TestingAble to write unit tests to your codeSkillful (although not necessarily practicing) TDD. Unit tests are written as “honest” as possible, understands where and when higher-level tests are neededIt is able not only to write effective tests of all levels, but also to develop and maintain all the necessary infrastructure for testing (starting from downloading a fistur ending with managing animations in a browser)It is able to identify non-obvious places of the project not covered by tests. It is able to optimize the testing infrastructure within the framework of business goals (speed of execution, etc.). Able to quickly evaluate test plans, including manual testing. Owns the problems of testing productivity, safety and so on
Business analysisRequires a verified TK. Negatively refers to edits arising in the process of work. Considers a valid ‘presumption of innocence’ – everything that is not specified in TK can be done at the discretion of the developerIt is able to detect insufficiently clearly formalized aspects of the terms of reference before the start of development.It is able to identify places in which the ratio of “efforts – obtained business value” is not in favor of business value and to develop optimal solutions together with Product OwnerAble to complete a full cycle of business analysis, including adequate management of requirements
Error handlingDon’t think about handling mistakes, believes in the bestKnows for potentially dangerous places in the code, uses try / catch and implements error processingUnderstands the difference between error recovery and failing fast approaches. He understands that they do not contradict each other and use the storehouse of the desired parts of the system. Separates error flow / exception flow in the systemMonitors the boundaries of error propagation and the areas of responsibility of handlers. It is able to identify places where errors are incorrectly “eaten” and where continuation after an error carries risks to the system
Code DocumentationWrites comments in codeHe writes a code that practically does not need comments. Uses jsdoc or similar approachesLikes autogenated documentation (starting from swagger ending with type generation based on graphql endpoint)Documented by high-level architectural solutions to facilitate the introduction of new people in the project
Code ExtendabilityNot thinking about code extensibilityWrites “maximum” extensible code, which sometimes leads to overdosesBased on personal experience, he sees the optimal balance between system extensibility, development speed and readability of the code. Prevents (based on ownership of the subject area and past experience) potential areas of code development in the future and lays them in the existing code baseIn addition to the optimal compromise on the extensibility and maintenance of the code, it monitors important metrics (for example, communication with other people’s libraries)