top | item 26539777

Ask HN: What are some tools you wish you had while doing your day to day work?

60 points| deviance | 5 years ago | reply

(as a software developer or just someone using software, in whatever field you happen to be working in).

An example:

-> As a software developer, I've come across the need to work with CSV-"like" files several times in my career (at several different jobs), for different reasons.

And it was most frustrating when they had like 100 columns or so. Having to change column 63 at line 58 is not something you do easily in Notepad++. Import to Excel was my way to go, but since the file was not a standard CSV file (e.g. also had sections like an .INI file) it was time consuming: first just select a subsection from the file, save to a different file, import to Excel, modify, paste back, etc. Maybe it was not the best approach, but that's not the point I'm making.

Not having found an existing tool (maybe my problem was too specific) I eventually made a small desktop application which I would use to edit the files directly. The interface was similar to Excel (grid of cells); It was simple and tailored to what I needed.

But maybe you are not a software developer and don't have the "luxury" of building it yourself.

So, would you share your experience of similar situations?

If the solutions to your problems are relatively easy to implement, then someone can create a tool for the job, making your life easier. And on the off chance that these tools are useful and will be wanted by more people (with similar problems) these "tools" can turn into a more general "product", thus a win-win situation in the end.

What i'm saying:

- There are already talented people working in their spare time on e.g. open-source projects (no shortage of people wanting to tackle the problem, if it is reasonable) - The shortcoming is that domain specific problems, which people are facing, are not visible enough (except to them).

If this question should get enough attention and answers, the next step would be to structure the answers into a git repository/website.

106 comments

order
[+] piinbinary|5 years ago|reply
I wish I had tools that were just a little smarter at working with code. There are some things that I find I have to manually track down in a large codebase, but the things I do could be automated. I'm thinking of operations like the following:

* Tell me where in package (or module) X it calls functions that can eventually reach function Y in package Z (that is, there is a possible stack trace starting in X that leads to Y.

* Recursively expand the tree of callers of this function.

* Show me where the value passed to this function are created.

* List what packages have functions that can get called when I call function X.

* Given two functions A and B, what functions can result in calls to both? (This is sort-of the greatest common denominator of possible stacks leading to A and B)

(It seems like this must surely exist, but I have yet to find it)

I also want better tools for tracing what a system does when running. For example:

* Say I have a test over some deterministic code, and I make a small change to that code. I'd like to be able to run that test before and after, and get a diff of where the computation was the same vs. where it was different.

* When debugging, I'd like to be able to ask questions about the history, like what set this field on this model to the current value? (With debuggers I've used, you have to know these questions in advance and set up things to watch - you can't ask those questions after the fact)

* List all packages that had a line of code run while running this test.

edit: formatting

[+] afiori|5 years ago|reply
> * Say I have a test over some deterministic code, and I make a small change to that code. I'd like to be able to run that test before and after, and get a diff of where the computation was the same vs. where it was different.

There are many things I do not like about ocaml build ecosystem but the last time I looked into it this was the default structure of test; is was possible to assert stuff in unit test, but you were "forced" to output something and then promote it to valid output; the next time the unit test are run the build tool check for diffs and you can choose whether the new output is wrong of whether it should be promoted to correct output.

I found it extremely flexible, expecially if you make an API change that would require to update dozens/hundreds of tests

[+] nscalf|5 years ago|reply
The stack trace comment is 100% what I wish I had built into my IDE, and from my time mentoring more junior devs, I can tell you this is one of the hardest things for them. All of these are great suggestions, but the first one really has been a pain point for me.
[+] armagon|5 years ago|reply
I wish I had a way to do knowledge work but also use my body.

Right now, for working purposes (as a software engineer), I'm a disembodied head that can move a pointer, type words, and voice chat. Our bodies were never designed to sit in chairs 8 hours a day for forty years. The very idea of needing to spend free time exercising just to keep your body from falling apart is, well, preposterous.

(It's been a long time since I've watched it, but I think this talks a bit about the idea: https://vimeo.com/115154289 - "The Humane Representation of Thought")

[+] tra3|5 years ago|reply
Stephen Wolfram (of the Wolframalpha.com fame) has a treadmill attached to one of his workstations [0]. I've read claims that walking 1-2mph takes no mental effort. Lets say 4 hours of walking would net you about 5 miles. That's a decent effort for the day and you could still sit the other 4 hours out of your 8 hour day.

[0]: https://writings.stephenwolfram.com/2019/02/seeking-the-prod...

[+] beforeolives|5 years ago|reply
> Our bodies were never designed to sit in chairs 8 hours a day for forty years.

Your body wasn't designed to do anything. It's the result of random mutations that survived better than other random mutations.

> The very idea of needing to spend free time exercising just to keep your body from falling apart is, well, preposterous.

A somewhat sedentary job with the option to take breaks to move around and exercise outside of that is still vastly preferable to any other combination. Non-sedentary jobs and manual labor will break and wear down your body in different ways, they aren't some ideal to aspire to.

[+] yoz-y|5 years ago|reply
I had a shower thought the other day. When playing games it's often quite normal to lean left, right, back in the heat of the moment. (The good old falling out of a chair in the heat of the moment).

It would be nice to have some sort of simple peripheral that would allow to translate simple body movement and maybe breath patterns (multiple games have a button to hold breath) into controls. I know that VR is a thing but I think there is quite some space between here and there.

For office style work one idea would be to have an extended desktop with parallax.

[+] wackro|5 years ago|reply
That talk looks really interesting. I'm all for a future that unbinds us from tiny 2d screens.

We're always going to need to do exercise though. There's no way knowledge work could ever e.g. raise your pulse, use your strength + agility etc. We are hunter gatherers removed from our original environment.

I can imagine software development becoming like something out of Minority Report and that's just about it.

[+] globular-toast|5 years ago|reply
There is such a thing as a walking desk. Linus Torvalds uses one. Never used it myself, though. Couldn't imagine doing any serious programming like that.
[+] fiftyacorn|5 years ago|reply
I've found working with the laptop in my garden can help. The mix of air and standing seems to help
[+] alpaca128|5 years ago|reply
Better documentation. And with better I mean documentation that does not rely on as many assumptions about the reader, and docs that include enough examples. I don't care about that one example which only covers the most trivial use-case that you included so there's an example in the docs. Examples should be like unit tests, I don't want to play the archeologist and dig through pages of outdated info just to figure out how to set that one weird flag.

One example for docs I enjoy is the reference for the Rust standard library. It still could use a few more examples here and there but overall it's among the best I know, together with tailwindCSS' website which is also great.

Don't be like the devs of that one JS animation library which locked further examples behind the registration form for another web platform, failing to mention those hidden examples are more or less a copy-pasted variation with slightly different numbers.

And I haven't thought about it very deeply yet but I'd like a tool or maybe lightweight processing language that lets me quickly visualise debug output and similar data. Often it feels like the main time sink at chasing certain bugs is how I either have to look at the raw data and numbers and try to see a pattern, or more or less start a whole side project to properly process and visualise it. Possibly I'm just missing something obvious or overlooked the usefulness of a neat tool at first glance.

[+] izolate|5 years ago|reply
> And it was most frustrating when they had like 100 columns or so. Having to change column 63 at line 58 is not something you do easily in Notepad++. Import to Excel was my way to go, but since the file was not a standard CSV file (e.g. also had sections like an .INI file) it was time consuming: first just select a subsection from the file, save to a different file, import to Excel, modify, paste back, etc.

Suggestion: have you considered learning to use Vim? I imagine most Vim users are reading your example wondering what the big deal is.

Not to take away from the spirit of your post, though. You have valid questions.

[+] wcarss|5 years ago|reply
As a longtime vim user, I don't see how vim makes going to the Nth logical column (for several values of N in different rows) in a large "CSV-like" file much easier.

Navigating in general is easier, sure, but... do you have a trick to share perhaps?

[+] sgarrity|5 years ago|reply
A standalone hardware mute switch for Zoom/etc calls so you can prominently and reliably see your mic mute status, and quickly and easily flip it on and off.

(I know there are a few do-it-yourself options for these, but I'd much rather throw a bit of money at it rather than time).

[+] dole|5 years ago|reply
I have a Jabra Evolve (40?) USB Headset. The headset plugs into the USB dongle via stereo jack and has green/red backlit Pickup, Mute and Volume buttons and can be used without the headset to mute.

Tested it without the headset in a Teams meeting and mutes within the meeting and displays status as such, doesn't just mute system mic volume. Edit: seems to work the same in Zoom as well.

The dongle itself is model ENC010 and looks to cost around U$50.

[+] fwsgonzo|5 years ago|reply
Sennheiser headsets tend to have a mechanical switch on the microphone arm that turns it on and off when you swing it. I like that part enough that I only buy those headsets now. I'm not sure if they continue the practice these days.
[+] screye|5 years ago|reply
1. A reliable python env manager. Some sort of framework to visualize changes to my env as a visual graph with each update/clone viewable in a git-tree like format.

2. Jupyter lab, but that's as good as VSCode/Pycharm (VS code's jupyter extension is still very lacking. Something like Spyder that's not really a notebook would also work fine)

3. A real Inking->Structure app. Come on. There is money in this. Someone do this. Something that is exportable to any of draw.io/Visio/etc.

[+] dglass|5 years ago|reply
Could you elaborate on your third point about Inking->Structure app? I've been thinking about this lately and am interested in what exactly you're looking for.
[+] softwaredoug|5 years ago|reply
On OSX I miss notepad. The dumbest possible text editor. No cloud syncing of notes, no attempt at being optimized for code, no intellisense behaviors, no spell checking or word processor functionality, no WSISWYGness. Just the dumbest possible text editing window to paste things, scratch a few notes, open raw text, etc. I haven’t found the equivalent in OSX even their basic tools are too smart by half.
[+] mettamage|5 years ago|reply
I use Sublime Text for this or vim, depending on where I am (in a terminal or not).

Vim is easy if you type vimtutor in the command line and follow the tutorial for the next 30 min. After that, it will always feel like a simple notepad, at least to me it did.

For actual coding I tend to use VS Code. I might give IntelliJ a try again if I can manage to get a free trial again.

[+] moystard|5 years ago|reply
You could use TextEdit I guess, but I agree that it's not a good experience; it just does slightly too much and not very well.

Ten years ago, this same frustration led me to release Fraise, a fork of Smultron, for quickly editing files.

I now use vim with a terminal to quickly edit a document, as I find most modern editors to be too slow to start (Visual Studio & co.).

[+] yumraj|5 years ago|reply
I use vscode for this.

The best feature is that it keeps unsaved files even after quits. I have an instance of vscode with about 80 unsaved documents till now. Hopefully vscode won’t introduce a bug in an update that will wipe these.

[+] codegeek|5 years ago|reply
I know, me too. The closest in Mac is TextEdit but then you have to do "Format -> Make Plain Text" when you open a new one.
[+] 41ice|5 years ago|reply
Try using 'Stickies'??
[+] happybday|5 years ago|reply
I would like a tool which allows me to examine Git histories of multiple files in a repo, with some notion of 'distance' between files. So if source file A includes classes or functions which are defined in source file B, then A and B are distance 1 apart (neighbors). B's other neighbors are distance 2 from A and so on.

As an example, I'm looking into a bug which I know is related to file X. I would like to see the most recent change which affects files within distance 5 from X. Or, of all the commits between point 1 and point 2 in the git history, I would like to see the ones which changed files the closest to X.

In another context, for every commit in a release, I want to see how big the n-neighbourhood of the commit is for different values of n, in the same way I can currently see how many files were changed by that commit (the 0-neighbourhood). In all these cases I would want to look at the path of connections between files and what symbols it is based on.

In an ideal world, the 'change distance' and 'change neighborhood' concepts would actually reflect the semantics of what was changed and how it could affect other classes etc. So a whitespace change would have empty neighborhoods since the code in no other file could have been affected. But even with a naive interpretation that any change to a file affects all the linked files would be very useful.

[+] mden|5 years ago|reply
Something I plan on making when free time exists - yet another tool for note organization but with features that I find missing from ones I've seen.

Table stakes:

  - Open source
  - Bring your own client (i.e. you can use any editor as long as data is accessible)
  - Core idea: allows for multiple sources of various types (and makes it easy to add new ones) and then it creates a unified and queryable view over them (via a separate client). Some examples:
  -- Keep notes in multiple files and get a single place I can search over them with annotations of where different pieces come from.
  -- Have source code as a source type. Parse comments that follow the right format to allow smart linking to code for references.
  -- Have the output of tools be source types too, e.g. the output of a grep command.
Bonus features:

  -- Some sort of alerts/notification feature that allows for configuration of trigger conditions
  -- Automatically generated graph view of related concepts / tags / whatever 
  -- Support for multi-user editing with some level of permissioning
  -- LSP support
  -- Editing sources from the unified view (whenever that makes sense)
[+] khaledh|5 years ago|reply
I wish there was a bi-modal programming language: a "design" mode, and an "implementation" mode.

Design Mode:

    - Define domain model: entities, relationships, constraints
    - Define behaviour: state machines, conditions, triggers, calculations
    - Define architecture: systems, subsystems, modules, interfaces/apis
    - Define rules for composition and communication
    - Define extensibility points, service provider interfaces
    - Define access points: ui, cli, api, lib
Implementation Mode:

    - Map domain model -> db schema, code constructs
    - Map behaviour -> code to evolve domain model/state over time
    - Map architecture -> libraries, executables, services, network topology
    - Map composition rules -> snap-in components from architecture using defined interfaces
    - Map extensibility points -> callbacks, hooks, discovery
    - Map access points -> connect ui/api to model and behaviour
[+] thecupisblue|5 years ago|reply
Working on something similar in my spare time, its quite... exhausting to be honest. Basic premise is you define a core model or different types of models and use transformers to transform them from one type to another, building a huge structure in the process than can help you generate stuff and notify of updates. The biggest problem is cascading updates, recursive calls, UI and performance in general. Currently doing it on the JVM but I think I should migrate to something closer to machine code to net realistic performance.
[+] runjake|5 years ago|reply
I don't know. I already have them (shell, shell utils, Python, Go, jq, JS, Ansible, etc).

I do what you mentioned all day, every day. I don't like the idea of "a more general product" because that's the power of the tools I use, they are small tools designed to do one or a few things only, but I can chain them together to do complex things. And if one of my small tools doesn't work for a particular task, I can swap it out with or write another small tool.

With your "CSV-like" example, I'd probably do something like grep with a regex to check a line and see if it has more than $x commas, and if it does process the line, if it doesn't ignore it and move on to the next.

I am about to head to a meeting, but something like this:

https://unix.stackexchange.com/questions/249071/check-if-a-s...

[+] deviance|5 years ago|reply
(OP) I agree with the point you are making. Smaller tools that can be chained together to obtain new functionality is better (in my opinion also) than "bulky" feature-rich tools (which can never be truly feature complete).

But! If you look at it from the perspective of someone who is a non-software developer (e.g. scientist, accountant, graphic designer, etc.) who just wants to do a specific task, it makes more sense to have dedicated tools for the job. Even if those tools, under the hood, are a combination of smaller tools, the end user should not be concerned with anything other than his/her field of expertise.

With my question I was trying to get some insight into people's (who are not necessarily software devs) workflows and how we can improve those workflows (if we can).

The question applies to software development as well: someone who is specialized, say in compilers (broadly speaking), for example, can help the workflow of many who don't have the time / resources to do it themselves. It comes to mind a feature that someone posted above: "List what packages have functions that can get called when I call function X".

[+] giantg2|5 years ago|reply
I wish I had a robot to do my job for me but still get paid.
[+] sombremesa|5 years ago|reply
Seems like we're close to having a viable meeting attendance as a service what with deepfake faces and voices.
[+] armagon|5 years ago|reply
When working with React and Redux and Redux Sagas, I wish I could more easily figure out causal chains for what happens. When I previously did work as a game programmer, for most things (except, say, debugging why things rendered a certain way), you could just go to where the thing happened, put in a breakpoint, and you'd get a beautiful call stack making it easy to reason about how you got to where you are.

In my current web development work, using the aforementioned tools, where it isn't just one thing calling the next, but there's a huge amount of indirection and message passing, I have to spend a ton of time figuring out what set of events occurred, and where, and why, to figure out why I got the result I got.

[+] afiori|5 years ago|reply
Is there a reason why the browser debugger is not useful in your case? (or in any other case?) I found it useful for debugging simple jquery websites but I imagine a dozen things can go wrong between the debugger and webpack/next/react/jsx/redux/hot-reload
[+] tuckerpo|5 years ago|reply
An actual real portable executable format, and standardized build tools. I hate having to jump through build system hoops to target the same piece of silicon with an annoying OS in the way.
[+] fwsgonzo|5 years ago|reply
Automatically saving and restoring terminals with tabs and separate histories, per workspace.

I have found nothing yet that does this, or even just one of those things. It would be the killer feature of a new terminal emulator - and I see there are lots of them being developed, but none of them have this! And I can guess why: It's because of the maintenance work required to have this feature, and also trying to be multi-platform, multi-desktop and also the work required just to have a working terminal to begin with.

[+] ab071c41|5 years ago|reply
I've been looking for software to map relationships between my team's products (app servers) and their integrations.

E.g. server01 can go from 3.1 to version 4.0 since foo01 integrates with server01 and foo01 supports 3.1 and 4.0.

I have been poking around at graph databases for this, but I'm also looking for something better than wiki pages.

[+] wsostt|5 years ago|reply
Yes! I worked at a well-known regional company about 15 years ago and we built one of these ourselves. It would track servers, software, packages, etc... You could quickly see which web servers were running which versions of .Net and then drill into the applications which had their own tagging to specific .Net versions. Then you'd have a clear picture of the opportunity/costs/consequences of upgrading the version on that machine.

I'm interested in this type of system for my current job and I can't find anything on the market.

[+] buescher|5 years ago|reply
It sounds like you wish you had the classic unix text file utilities like sed, awk, grep, cut, and so on.
[+] bostonsre|5 years ago|reply
Yea, more often than not if you wish there was a tool to do something that seems trivial, someone already thought of it and solved it well.
[+] motohagiography|5 years ago|reply
Maybe I haven't looked hard enough for these but off the top of my head:

- A universal calendar I can merge across client accounts. As a consultant, I have customers in gsuite, o365, and my personal one and relationship management means manually synching my calendars between them.

- A virtual machine for android phones to sandbox identities and apps into, as I'm not interested in letting a client's MDM near my BYOD mobile.

- A userspace version of Paralells with a linux image that runs on enterprise client's locked down windows thinkpads.

- a Cypher-like graph query language that operates as an abstraction over spreadsheets.

- an excel plugin that de-dups rows and generates Sankey diagrams from selected columns.

[+] klmadfejno|5 years ago|reply
An equivalent to excel's record macro functionality, but at the os level, based on what's on the screen using ocr.

Sikuli got close, but something with a little more AI behind it to get a sort of "fuzzy" macro recording.

[+] wcarss|5 years ago|reply
Windows at least has AutoHotKey[1] -- it's kind of awful, but also kind of great. It has been a path into programming for more than one person I know and has saved others countless hours of repetition.

1 - https://www.autohotkey.com/

[+] DanielDe|5 years ago|reply
An app I built, Keysmith [1], does something pretty close to what you're describing. It's macros anywhere on your Mac, but instead of using OCR we use accessibility APIs to identify UI elements by name. There's also a browser extension to do the same on the web.

And you can save macros for later use or just create a one-off "Scratch" macro as described here [2].

[1] https://www.keysmith.app/ [2] https://www.keysmith.app/guides/creating-and-running-macros

[+] jayant_kaushik|5 years ago|reply
Do you mean Robotic Process Automation? It’s OS level and ticks all the blocks.
[+] nwienert|5 years ago|reply
- A monorepo build tool that handles having a "base" Dockerfile that builds the monorepo dependencies (npm install + npm build) but that then lets sub-images use a subset of the repo easily without needing to re-install/re-build.

- A really nice TypeScript shell scripting setup. I'd like to see Duktape or JavascriptCore used, combine with esbuild/swc, Actually Potable Executable, and ShellJS. Basically, give me a single binary that runs cross platform, so I can write my scripts using TS. Anything to save me from having to continue googling weird bash edge-cases constantly.