Coming up with a meaningful list of skills in a mid-sized development company
At Jobsity—a software company based in New York, Ecuador and Colombia—we’ve been growing at a steady pace for the last couple of years. This means, among other things, that we suddenly find ourselves thinking more and more about processes that were easily glossed over in the past.
We’ve always believed in keeping our company lean, but there comes a point where if you don’t get a bit of infrastructure, it begins to impede growth.
So six months ago we got an office—this office—and now we’re working on the standardization of interviews, on-boarding, and continuous training.
As a response to this need, we got together and came up with a list of skills to focus on as we head into 2015. These come both from the work we’re doing right now, and from what we expect our clients will require in the near future. The plan is for our people to learn about these subjects as they grow with the company, whether they’re involved in them through real-world projects, reading or practicing at home, or taking online courses.
Initially we brainstormed many items that didn’t make our final list. It is worth noting that this only represents what has worked for us up to this point in time; this is not a comprehensive list meant for everyone. Having said that, I hope it will be useful to other companies with similar objectives.
We’ve categorized these skills into seven main branches: languages, applications, and tools consist of concise knowledge to help build web apps; servers deals with being able to configure a web server, including concerns such as performance on big projects; methodology and professionalism involve areas that, while not necessarily technical, are paramount when working on teams and with clients; and finally, passion is about cultivating one’s love for programming and software.
Here is the complete list:
Understand how PHP works internally, from the zval structure, to hash tables, to how functions are implemented. Read the source C code for some of these functions. Be familiar with writing code in both OOP and Procedural form. Understand PHP’s origins as a simple HTML preprocessor, and how it became such a widely-used programming language.
Know how SQL statements can affect performance on the DB. Be able to identify and solve performance issues related to queries. Become familiar with tools for measuring performance on relational databases, such as the EXPLAIN command on MySQL. Understand data normalization and SQL joins. General knowledge about relational vs. NoSQL databases.
HTML and CSS
Know how to properly structure CSS files and understand how SASS makes this easier. Be aware of the available HTML5 tags and the semantic use of them. Know the best practices for doing responsive design. Know how to use a modular approach to creating CSS using a guide like SMACSS.
Have the ability to quickly implement code that consumes external APIs. Become familiar with at least one PHP library to help with the task, e.g. Guzzle. Know the different types of HTTP status codes. Understand how APIs are secured.
Know the Drupal CMS inside out. Learn about general CMS concepts through the use of it, and also about its specific features. Notice how Drupal’s hook system relates to aspect-oriented programming. Also get familiar with commonly used modules: views, panels, display suite, apachesolr, etc.
Know about MVC through the use of this easy-to-use PHP framework. Be familiar with concepts common in all frameworks, such as Controllers and Views, and have the ability to use and extend an ORM. Be able to define business logic in the model and use dependency injection.
IDE and productivity
Master your current IDE. This provides lots of productivity and good practices. We provide several general ideas on what benefits can be achieved, like for example refactoring (rename, etc.) and the use of a debugger like xdebug. It’s 100% necessary to master a console editor too, in order to manage files via ssh.
Be familiar with the underlying concepts of version control systems, in particular, Git. This means being able to do merges, resolve conflicts manually, manage branches, do reverts, etc., without the help of a GUI.
Feel at home using the command line. This includes abilities like moving between the filesystem, user management, understanding and assigning permissions, installing packages and dependencies, searching for files and inside of files, using keyboard shortcuts, etc.
Understand the different layers involved in a big web application. This includes understanding memory caching (such as Memcache), full-page caching (Varnish), CDNs (Akamai), and how these components interact with each other.
Create and use reproducible environments with the help of tools such as Vagrant, with provisioning tools like shell, puppet, ansible, or chef. The idea is to allow developers to work in environments that are as similar to production environments as possible.
Understand the concepts behind multinode deployments, be able to write a Capistrano recipe to deploy an app/web on a server(s) from the command line, using ssh and git to deploy new code. Understand and know how to handle deployment problems.
Know the different areas where applications can have bottlenecks, such as database, network, backend code, and frontend. Use tools like XHProf, New Relic and Chrome Tools to profile an application and discover these bottlenecks. Know about best practices to avoid and fix performance issues.
Know what test-driven development means, and what its benefits are. Be familiar with specific unit testing frameworks such as PHPUnit, and have the ability to implement tests for custom Drupal modules.
Know Scrum by reading the basic theory. Practice it not only on development but on any tasks you have to accomplish. Be familiar with the point system and be able to break tasks to smaller, daily tasks. Understand how it relates to a PM tool such as Pivotal Tracker where you can track velocity.
Be able to accurately tell how much time a task will take. This applies at all levels, from junior where developers need to be able to estimate the time for a specific task that is assigned, to senior levels where they should be able to estimate more abstract and complex tasks.
Analyzing user needs
Be able to translate user needs into technical requirements and specs, always looking for the best possible solution. Guide the client/user on choosing the best solution (clients will not know most of the time what it is they want and how they want it implemented).
Be aware that software development is not a “lonely ranger” activity but a coordinated effort between a team’s members. Encourage communication with peers and clients. Improve general writing and speaking skills using English. Learn proper ways to communicate in a business manner. Identify chains of command and use a correct etiquette to report ideas and issues.
Pragmatism vs. dogma
Be smart and get things done. Every project is unique in size, budget, target, and expectations, and different solutions and tools can be applied in different scenarios. The perfect solution is not always the right solution. Choose wisely and keep relevant considerations in mind. Understand this balance and how to avoid technical debt without compromising deadlines.
Reading code from others
Understand the benefits of reading code from other developers and open source projects in order to get new ideas about design and best practices. Also, improve the ability to read code from legacy projects and detect “code smells”.
Add personal programming exercises (katas) to the normal day to day workflow. These katas are a mind fitness program focused on programming. The same exercises solved over and over again provide improved solutions each time, new discoveries, and mind agility.
Move away from your area of comfort and face new challenges using different programming languages, paradigms, and methodologies from the ones you usually follow. Thinking out of the box is one of the keys to creative solutions, personal pet projects or projects with other Jobsity developers are a great way to acquire new abilities.
Be aware of the skills of your workmates. Have more than one mentor who can help when you have doubts or questions, both about technical aspects of the job and about soft skills. Become the mentor of other people.
Quickly share your problems and solutions, making them less likely to be hidden from other developers on a project. Encourage yourself to use this technique as a learning tool; knowledge is constantly shared between pair programmers, from tips on programming language rules to overall design skills.