Key Skills in software engineering
I am often asked about the key skills that a software engineer must possess as they progress thru their careers. In an effort to make life…
I am often asked about the key skills that a software engineer must possess as they progress thru their careers. In an effort to make life simpler for me I have compiled a list of various skills and topics that might be relevant along with a bunch of links to well recommended books.
Clearly, this can benefit from inputs from other experienced tech managers and so if you feel like there is something I missed, or a book you strongly recommend, please comment on this article.
Programming Language
A strong grasp on the language paradigm, runtime, type system, concurrency models, syntax, unicode support, features, weaknesses, debugging, static analysis, build tools and deployment pipeline. A familiarity with its standard library, regular expressions and other regularly used libraries and frameworks.
References
- Head First Java
- Effective Java
- Java Performance
- Java Concurrency in Practice
- Java Generics
- Fluent Python
- Effective Python
- Mastering Regular Expressions
- The Debugging Mindset
- Debugging: The nine indispensable rules
- The absolute minimum every programmer should know about Unicode (blog post)
Operating Systems
Understanding the various sub-systems of an OS, specifically Linux. Complete clarity on concepts like process, thread, locks, interrupts, scheduling, memory addresses, segmentation, paging, select, IO subsystem, IO devices, file systems, shells, common commands etc.
References
- Operating Systems: Three Easy Pieces
- Elements of Computing Systems
- Code
- Unix Programming Environment
- Art of Unix Programming
- What every programmer should know about memory
- Latency numbers every programmer should know
Networks
Familiarity with the various layers of the OSI model and programming language APIs for network programming. Expertise in the TCP and IP layers as well as DNS and HTTP. Optionally, learn about SMTP and SIP.
References
- Networks by Tannenbaum
- TCP/IP Illustrated (3 Volumes)
Databases
Understanding relational row stores, ACID properties and SQL . Also learn relational column stores and NoSQL Key Value and Document based databases. Its also important to know about high availability, sharding and replication.
References
- Database System Concepts
- Reading in Database Systems (Advanced)
- Head First SQL
- SQL AntiPatterns
- High Performance MySQL
- The Art of SQL
- SQL Queries for Mere Mortals
- SQL Performance Explained
- NoSQL Databases
Browsers and the Internet
Topics related to the functioning of the internet such as DNS, HTTP, SMTP. Familiarity with HTML and the Document and Browser Object Model. CSS and its box model as well as responsive design. Javascript programming in the browser and awareness of resources that list current browser quirks and techniques. Other concepts such as Unicode, localisation, internationalisation, AJAX, caching, search engine optimisation, proxying, and the browser javascript event loop. Finally, performance optimisation for the browser as well an understanding of how Content Delivery Networks work.
References
- WebPlatform.org
- Frontend Web Development : The Big Nerd Ranch Guide
- What every programmer should know about SEO
- Javascript: The good parts
- Secrets of a Javascript Ninja
- Javascript Patterns
- High Performance Web Sites
- The front-end checklist
- The front-end design checklist
Algorithms
An understanding of various data structures such as stacks, queues, linked lists, sets, hash tables, heaps, trees, graphs and matrices. Topics like time and space complexity of algorithms, big-O notation, recursion, sorting, searching, traversal/enumeration, string matching and search, greedy algorithms, dynamic programming, linear programming, divide and conquer and NP-completeness.
References
- Introduction to Algorithms
- The Algorithm Design Manual
- Algorithms course by Shai Simonson [videos]
- Theory of Computation course by Shai Simonson [videos]
- Algorithms everyone should know
Code Design
Familiarity with object oriented and functional programming paradigms as well as design patterns, anti patterns, refactoring, test driven development, security and other best practices
References
- Clean Code
- Head First Design Patterns
- Programming Pearls
- Structure and Interpretation of Computer Programs
- Domain Driven Design
- Test Driven Development By Example
- Release It
- Refactoring
- Refactoring to patterns
- Working effectively with legacy code
- Functional Thinking
- Professor Frisby’s mostly adequate guide to functional programming
- Falsehoods programmers believe in
- Foundations of Security: What every programmer should know
- 24 Deadly Sins of Software Security
- Open Web Application Security Project
- Writing Secure Code
- Iron Clad Java
- Security Engineering
Quality Assurance
Topics such as UI testing, Cross Browser specific testing, Integration testing, API testing and unit testing. Also styles and approaches to testing such as manual testing, automated testing, exploratory testing, sanity testing etc.
References
Architecture & System Design
An understanding of monoliths, service oriented, micro-service and peer to peer architectures. The use cases and distinction in various concurrency models including but not limited to blocking, non-blocking, synchronous and asynchronous, threading, actor based, reactive, communicating sequential processes, software transactional memory, coroutines, etc. Other concepts such as scalability, high availability, CAP theorem, optimistic and pessimistic locking, distributed locks, ACID, caching, queuing, batch processing, load balancing, consistent hashing, consensus algorithms, sharding, federation, data warehousing, relational and non relational stores, serializiability, Lamport clocks, service discovery, blue green deployments etc.
References
- System Design Primer
- Clean Architecture
- Design-It
- Building Evolutionary Architectures
- Seven concurrency models in seven days
- Designing data-intensive applications
- Distributed Systems
- Awesome distributed systems collection
- Leslie Lamports Writings
Productivity, Soft Skills etc
Too many topics to list but essentially anything that improves you professionally.
References
- The Pragmatic Programmer
- The Productive Programmer
- The Passionate Programmer
- Getting Things Done
- Programming Beyond Practices
- Soft Skills: The software developer’s life manual
- Clean Coder
- Speed in software development
- Best Software Writing
- Pragmatic Thinking and Learning: Refactor Your Wetware
- On Writing Well
- How to make wealth
People Management
Topics related to people management, including but not limited to hiring, mentoring, training, coaching, organising, evaluation, monitoring, supervision, motivation, goal setting, conflict resolution, negotiation skills, delegation, communication and listening skills.
References
- Peopleware
- Who: The “A” method for hiring
- The best team wins
- The Alliance
- Work Rules
- Radical Candor [blog]
Project Management
Concepts such as project management such as estimations, agile practices, tasking, sequencing, scoping, time management, risk management, business continuity, disaster recovery, prioritisation and triaging, resource allocation, stakeholder management, retrospectives etc.
Product Design
Aspects related to understanding customer needs and solving for them.
References
- The Inmates Are Running The Asylum
- Don’t make me think
- Design of everyday things
- Crossing the Chasm
- Hooked
- Inspired
- Product Leadership
- Intercom on Product Management
Business sense, strategy and marketing
Various topics relating to business
References
- Lean Startup
- The innovators dilemma
- The innovators solution
- Crossing the chasm
- Good Strategy, Bad Strategy
- The E-Myth Revisited: Why Most Small Businesses Don’t Work and What to Do About It
- Zero to One
- Traction
- The hard thing about hard things
- High Output Management
Leadership
Ideas about leading as well as other topics that might be useful to someone in a leadership role.
References