DEV Community

Cover image for What Should be in a Coder's Toolbox?
Sam Jarman 👨🏼‍💻
Sam Jarman 👨🏼‍💻

Posted on • Originally published at samjarman.co.nz

What Should be in a Coder's Toolbox?

As Developers, we’re often met with many different technologies, all new and foreign to us, and with someone telling us it’s the next big thing and we must learn it. I’ve listened to those people for years now and I’ve found some patterns for a suitable abstraction of what types of technologies should be in your toolbox. So here there are…

Firstly, I believe in the full stack dev mentality. I genuinely believe any developer should be able to do any task. That’s not to say there isn’t room for specialists, or full time certain-technology-only-developers, but I believe the best developers are the ones who mix and mingle with other technologies, bringing the patterns back to their “home” language, keep their learning skills sharp and who keep their mind open. With that said, I believe that developers should know a bit of everything, and here are the bases I’ve covered in my career. So what should be in a minimal toolbox for every good developer?

A Web Framework

This could be Ruby on Rails, Node.js, PHP, Phoenix, Perfect, etc, it doesn’t really matter. The point here is the idea of what a web framework should do – it create, reads, updates and deletes (CRUD) data from a database in response to a given HTTP request, and provides a suitable response. It might also kick off background tasks or add data to a queue/stream to be processed later.

A Task Runner/Scheduler

As mentioned above, a task runner is good for task that need to be run at some point in the future, or on a schedule. This could be Cron, sidekiq, Verk, even windows task scheduler. The idea here is to learn that some tasks need to be happen relative to time itself or relative to a request, but can be performed at a later time. As an example, processing a file upload; the response is ‘we got your file, thanks!’ but the background task could be the actual processing of the file and perhaps sending an email when the processing has finished.

Queue Software

This could be RabbitMQ or Amazon SQS or Azure Queue Storage/Message Bus. The idea here is that some software on the backend are named “producers” and they put data on the queue to be consumed by “consumers”. This lets you start or stop more consumers based on load on your server.

Stream Software

Similar to queuing, where items entering the queue are removed by the consumers, streaming software lets blobs of data flow past like a river and many consumers can react to what they see go past. This could be Kafka, Amazon Kinesis etc. The difference between a queue and a stream is also important, but this isn’t the time to cover that.

A Frontend Framework

This could be EmberJS, Angular, React+Redux, Vue.js, even jQuery! The idea of knowing a front end framework is to learn such interesting lessons as browser quirks, trans/compilation of languages, web debugging/inspecting, responsive design, de/serialization of data and UI/automated testing.

A Mobile App Framework

While not essential, I think it’d be useful to learn at least one mobile platform, such as iOS, Android or Windows 10 Phone. It could also include Cordova, React Native, or even Unity. Mobile programming teaches a lot about programming with tech constraints and weighing up a lot of user experience trade offs such as small screen size, battery life and privacy. The IDE support also makes for a pleasant environment to work in.

A Scripting Language

There are times where you need something quick and dirty for a bit of scripting. This may be AppleScript, Bash, Powershell, Python or Ruby. Just something to automate a task for a one off or to run every now and again with Cron or similar. Every good dev should know when and where to write something quick and hacky, and having knowledge of how to do so is great.

A Relational Database

This could me MySQL, PostgreSQL, MS SQL Server or anything similar. The idea here to learn about how relational databases work and how records are stored and searched for. It would be good if you learned the benefits of stored procedures vs in code procedures and what kind of optimisations can be made at storing and retrieval time.

A Non-relational database

There are more and more of these, and each are optimised to do a certain task, such as ElasticSearch for search or Druid for time-based data. This could also include more general purpose NoSQL databases such as MongoDB or DynamoDB. You should try to understand the difference between NoSQL databases and SQL databases (non-relational vs relational)

And that’s your toolbox! With these you could probably build anything you wanted, or contribute you almost any software business. Of course, you don’t have to learn all of them in a week, it’ll take a few years. You also don’t need to be passionate about all of them, you can pick and choose – it’s your career. There’s probably some other technologies worth mentioning that I have forgotten, so gently calmly mention them to me! Good luck :)

This is the 12th post in my Junior Developer Diaries blog series. I’m writing more every week, and you can sign up to hear more and read previous posts on my website.

Latest comments (45)

Collapse
 
aziflaj profile image
Aldo Ziflaj

Why not throw any embedded systems programming skill in the mix? I mean, it's coding...
Point being, you don't actually need all these skills in your toolbox. Knowing what they are and where/why to use them, sure. But actually learning them all in a professional way takes a lot of time, and just using them in a single project doesn't always count.
More important than being a master of all trades, IMO, is being able to adapt to different environments. Going from front-end to back-end or vice versa shouldn't be a big hustle, but I don't expect a React.JS/Native developer to know anything about message brokers

Collapse
 
samjarman profile image
Sam Jarman 👨🏼‍💻

(This is definitely an older post for me, so I've had some more thoughts since publishing)

I think the idea is that every good engineer should know what they dont know.

And, on the contrary, I think a frontend JS dev should know about message brokers, often used in delayed writes (conceptually), otherwise when they post back to the server, and the page refreshes, they might be very confused as to why the content doesn't reflect the recent addition! :D

Collapse
 
okolbay profile image
andrew

I would add containerization/replicatable env tools - virtual box, vagrant, docker (swarm), kubernetes

after all, you are not running mysql and java and god-knows-what-else on your bare mac (or do you?))))

Collapse
 
samjarman profile image
Sam Jarman 👨🏼‍💻

I use Docker for mac - thanks for the addition, I think it's valid! :)

Collapse
 
djiit profile image
Julien Tanay • Edited

Hi there !

May I suggest you replace Node.js with Express and PHP with Symfony ? Those are not Frameworks, the first one is a JS Runtime and the second one is a language :).

Cheers

Collapse
 
warb profile image
Craig Warburton

Great article Sam! I’m an infrastructure architect learning to code and this (along with the comments so far) provides me a with a great high level overview of what I should be looking at. I’m already working through a full stack course so it’s goid to know that I’m on the right tracks.

Collapse
 
samjarman profile image
Sam Jarman 👨🏼‍💻

Nice Craig, I'm glad I could help :D

Collapse
 
wanderleyfa profile image
Wanderley

Can I translate this text into Portuguese?

Collapse
 
vikramj74 profile image
Vikram Jaswal • Edited

Awesome post. I resonate with almost all of your suggestions. Apart from stream processing in kafka, I have been able to work with all the other mentioned technologies that you've mentioned. I am also an evangelist of developing a broad understanding of concepts. It helps the brain grow, according to me. Thanks for the post.

Collapse
 
samjarman profile image
Sam Jarman 👨🏼‍💻

Thanks!

Collapse
 
gaja6413 profile image
Gajapathy Raj

When I read the topic I was expecting git. But it wasn't there):

Collapse
 
samjarman profile image
Sam Jarman 👨🏼‍💻

Yup, someone mentioned that in the comments. Should be there, but I assumed obvious ;)

Collapse
 
fzngagan profile image
fzngagan

I can relate to it but I would like to add some things I feel are essential...

Algorithms
Functional Programming(basic)

Collapse
 
samjarman profile image
Sam Jarman 👨🏼‍💻

Good suggestions! Thanks

Collapse
 
aladin002dz profile image
Mahfoudh Arous

isn't it said "specialize"? doesn't this make us "jack of all trades"?

Collapse
 
samjarman profile image
Sam Jarman 👨🏼‍💻

Nope. Specialisation vs generalisation is a bit of a debate in the software world. More here softskills.audio/2016/08/29/episod...

Currently, I'm on the generalise side (note, this list excludes things like game dev, embedded... so its not that general)

Collapse
 
aladin002dz profile image
Mahfoudh Arous • Edited

I've listened to the podcast, seems like there is no right answer for the the question, and it is slightly inclined to generalism...

Thread Thread
 
samjarman profile image
Sam Jarman 👨🏼‍💻

Exactly :) Pick one.

Collapse
 
ibrahimwehbi profile image
Ibrahim Wehbi

Well I am new in the Web Development business and I'm trying to work my way by studying daily(concentrating on HTML HTML5, CSS CSS3, JavaScript, and PHP). However, I studied ASP.Net and C# at the university but it didn't serve me well.

At the moment, I am working my way to become a senior programmer as I have finish a maze game that shifts on particular places and you must study the terrain for hints to solve it, otherwise you'll get stuck with the shifting terrain!

And working on a Wedding Designer Website for my relatives.

I would be pleased if someone gave me links to some advanced Web Programmer Websites to help me further on in my studies and researches!

Thank you,
Ibrahim Wehbi

Collapse
 
samjarman profile image
Sam Jarman 👨🏼‍💻

I wouldn't aim towards a senior just yet. To me, at least, senior indicates about 10 years experience of working on teams, mentoring juniors, putting out metaphorical fires and communicating with customers.

At this point you should look for a job. Most sites will teach you the basics.

Once you have some good skills under your belt - put them to use, either on a personal project or a commercial one.

Good luck!