When learning to code, developers-to-be are usually taught to code vanilla software. In the workplace, however, developers use many tools to speed up their coding. Common tasks like testing, running various scripts, and programming environment control are just a few examples of when an extra tool comes in handy.
The trouble is, there are many of these tools on the market, and it’s hard to know which are best. It often takes years of trial and error to discover which tools are the most helpful. To save you that effort, we asked some experienced developers about the tools that have helped them become better coders and maximize their efficiency on the job.
Today, we’ll look into these 7 tools:
Developers have long used Linux for its flexibility and customization options. I3 furthers these options to provide near-complete control over your programming environment.
I3 is a lightweight open-source tiling window manager for Linux. Window managers are used to control the appearance and placement of windows on a screen. Tiling window managers take this a step further by automatically resizing and rearranging windows to always use the full-screen space without overlapping. This tiling works over the top of your operating systems graphical user interface (GUI) to make changes directly.
Here are some ways I3 Window Manager (i3wm) stands out:
Lightweight: I3 is simple and efficient. It contains only essential functions without extra fluff and is specially designed for developers to use minimal processing power.
Keyboard Controlled: I3 has extensive keyboard shortcuts built-in for any desired behavior. You can also add additional shortcuts directly to your config
file. You can move tiles, open the terminal, change layouts, and more, all without touching the mouse.
Total Screen Usage: By using tiling, I3 ensures you never have to search a pile of tabs for a single window. You can have as many tiles open as you want while minimizing eye strain with bigger windows. This kind of tiling system is perfect for system administrators who need multiple terminals or anyone who needs test and draft terminals.
Custom Themes: I3’s appearance is fully customizable to fit your aesthetic. Operating systems like Windows or macOS have certain visual elements set as unchangeable. With I3, every inch of the screen is yours to customize. Fine tune your background, window appearance/behavior, notification appearance, and more.
One of I3’s most useful tools is the ability to group windows into numbered workspaces. Developers often set workspaces for different parts of their workflow. You can quickly switch between workspaces by pressing super
and the index of the workspace. This will hide all current windows and position the windows of the selected workspace.
Optimal use of workspaces speeds up productivity. They’re also useful for dual-monitor setups as you have a workspace open on each monitor and quickly switch which monitor a workspace is currently on in just one keypress.
Vim is a text editor for most programming languages. This developer-focused text editor focuses on key binding customization and coding efficiency.
It’s a modal text editor, meaning it can have multiple modes that are each optimized by the user for a specific task. For example, you may have one mode set up for Python and one for C++. These modes allow one keystroke to have different behavior depending on the language, such as language-specific shortcuts.
Like I3, Vim is entirely keyboard controlled. By cutting mouse use, you can reduce downtime and reduce workflow interruptions. Vim is also designed to work on nearly any major platform, which is ideal for team collaboration.
Finally, Vim’s shortcuts are all configured in a sharable .vimrc.
file. Many developers post their tested files on Github. Starting with one of these files allows you to benefit from your peers’ experiences while leaving your personal version available for individual editing.
One of the most core paradigms held by programmers is DRY: Don’t Repeat Yourself.
We see this in code as the ability to recognize and extract repeated code behavior into a modular method. This modular thinking allows you to type each behavior only once and then simply call the method whenever you need that behavior later.
Use this same paradigm to set up your Vim shortcuts for efficiency. For example, if you notice that your work frequently requires you to implement a binary search tree in Java, you can set up a shortcut to paste a binary search tree template.
Bash is a free Unix shell developed for the GNU Project. It has long been used as the default login shell for Linux, and more recently, MacOS and Windows 10. Other than logins, Bash supports hundreds of commands that can be called from within the application.
Bash is known for its scriptability. Rather than typing in a set of commands each time you want them, you can instead save one shell script file that contains all those commands. Each command will execute in the order that they’re entered.
Bash acts at a near-bottom level, meaning these commands can manipulate files and memory all without opening a desktop app medium. For example, you could create a shell script that systematically transfers the full contents of a hard drive to another device without ever opening a file manager like File Explorer.
By bypassing desktop applications, Bash can work more efficiently and often allows for more specialized tasks.
See Educative’s article on Top 25 commands and creating custom commands for a cheat sheet of all the best commands for developers.
Effective use of Bash history can make the difference between competency and mastery. To make sure you’re getting all you can out of your history, here are a few helpful commands you won’t want to forget:
Multi-Window Enabled History
By default, Bash only records history from the first instance opened while all subsequent windows have their histories lost. The following command enables all active Bash windows to write to the history, so you never lose a command again.
shopt -s histappend
Repeat Last Command
Repeating the last command executed is a common function in Bash. You can enter any of the following 4 commands:
enter
to execute itctrl+p
to view the last command and enter
to execute it!!
in the command line1-!
in the command lineYou can add additional elements to commands repeated with
!!
by including them before or after:sudo !!
Reverse Search History
You can search Bash’s history for past commands. Simply press ctrl-r
and begin typing your search to have Bash autofill with matching lines. If multiple lines match, press ctrl-r
again to cycle through them.
Functional programming is a declarative programming paradigm that used to create programs by combining pure functions.
Programs are constructed through single or combinations of small first-class functions that do not have side effects. Declarative programming focuses on building solutions to follow what is to be done rather than how it will be done. You can easily design declarative programs thanks to the mathematical, logical roots of the paradigm.
Functional programming is more modular than other approaches. Splitting your program into smaller functions allows you to reuse them across your program. Larger problems can be solved by combining these smaller modular functions. This allows you to reuse any part of your solution individually.
Finally, functional programming functions do not have side effects. This means that data is never changed in functional programming.
For example, say I wanted to make a program that starts with n
, then passes n
to function1
, and finally passes the result of function1
into function2
. Let’s see how this differs in pseudo-code:
Block Approach
int n = 5;
n = function1(n);
n = function2(n);
return n;
Functional Approach
int n = 5;
return function2(function1(n));
In the functional approach, there are no side effects to our function as n
’s value is used but never changed. By passing function1(n)
directly into function2
rather than an augmented n
, we have solved the problem declaratively.
There are functional programming languages that enforce this paradigm, such as Clojure, Scala, or Haskell. While these have great capabilities, they can be a difficult transition if you’re unused to functional programming.
To start out, try programming in your current language using a functional mindset. Here are a few ways to do that:
map
, reduce
and similar operations over counters and loops to shift your thinking away from block programmingRegression testing is the act of confirming that developed software still functions after an update. This is an important part of a developer’s life, as updates are so common. Unfortunately, the process can be highly tedious when we have to cover all possible error conditions.
Reflect solves this problem by creating automated regression tests for any website. This software doesn’t require any installation and can be used with any JavaScript framework.
Here’s how it works:
The results of the test will be a video of what happened as well as prints of network requests and the JavaScript console. Getting all this info at once allows you to diagnose the problem quickly and at its source.
You can create the test case once and repeat it an unlimited number of times across a site’s lifetime. Not only will this save you countless hours of manual testing, but it also automatically generates video recordings of each test to document the exact error case.
In short, Reflect is becoming popular with developers because of its simplicity, repeatability, and accuracy.
What we covered above is just the tip of the iceberg for what Reflect can do. Here’s a list of some other helpful functions you can use with Reflect:
Regular expressions, or regex, are a set of characters that describe the behavior of a search pattern. They’re often used for string-search algorithms to find sections matching the pattern.
Bash has a unique regex operator =~
which searches for matches of the given regex pattern. For example, if [[ $digit =~ [0-9] ]]; then
would search a string for any instance of a digit.
Other than Bash, both Python and Java support regex parameters.
These are great for data validation and other text processing tasks because they can implement very complex search parameters with just a few characters. They’re also recognizable by developers across the world as they’re part of regular language established by computer language theorists.
Overall, they’re quick to pick up, widely understood, and have great complexity potential. Learning regex is a great way to widen your skillset and give you access to a powerful tool on Bash, Java, or Python.
One of the most common uses of regex today is web scraping, a process of extracting select information from a mass collection of websites. This is because you can use regex to extract substrings matching the parameters from the greater searched string.
There are many applications of this, for example, you could search a competitors site for their prices on a given product:
$:\s+([^\s]+)
This regex searches for anything that comes after a dollar sign and extracts it to a separate file. Once complete, this file would allow your company full access to compare prices across dozens of products.
The above is just one example using only a single expression. Web scraping is a powerful tool for modern companies and will continue to grow in popularity. Learning regex for web scraping can give you a competitive advantage in more analytical development positions.
While regex starts off easy, they can quickly get very complicated. Look no further than this regex to match specific types of URL.
^(http|https|ftp):[\/]{2}([a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4})(:[0-9]+)?\/?([a-zA-Z0-9\-\._\?\,\'\/\\\+&%\$#\=~]*)
You can clearly see just how complicated they can get.
RegExr is a free regex visualization and testing tool that aims to make it easier to understand complex regex functions. As regex is standardized, RegExr simply parses all sections of the regex and translates their meaning into an explanatory sentence form. You can also hover over these explanations to see highlights of exactly where in the expression it was found.
Below, I input the complex example used above and used the explain function. See how the explanation is color-coded with the given section highlighted:
RegExr saves you time of working with longer regular expressions. It also removes the need for library memorization. On the site’s side, you can find a full bank of regex formula and their uses. Simply clicking them inserts these formulas into your expression.
Finally, RegExr can be used to test your expressions by filling the “test” area with example text. RegExr will apply the drafted regex to search the example text to highlight any matches. You can hover over these matches to get more information on them, like what section of the expression caused this to be picked up.
While RegExr can help to explain long regexes, they’ll always be harder to understand than shorter expressions. Prioritizing shorter expressions will allow you and your team a better shot at understanding the expression at a glance. Further, getting a single expression to complete all search parameters is a time-consuming process that becomes more prone to error.
Try applying multiple smaller expressions that each search for one or two things. This not only fixes the problems stated above but allows you to reuse some or all of the expressions in later projects.
With that, we’ve completed our look at 7 tools and software to help you be a more efficient programmer. From Vim, to Reflect, to RegExr, we explored some of the most used and beloved tools suggested by developers, for developers.
While some of these tools have a learning curve, I assure you that you’ll ultimately save hours of time and thousands of keystrokes by mastering them.
Free Resources