I've asked this previously: https://news.ycombinator.com/item?id=22849208
But a few years have past and want to see what's emerged since. Although can be new to you vs. released in 2021 or 2022 necessarily.
Things I've come across in the meantime:
* mock AWS services https://github.com/spulec/moto
* query cloud services https://github.com/turbot/steampipe
* munge CSV https://github.com/johnkerl/miller https://github.com/BurntSushi/xsv
* page json https://github.com/PaulJuliusMartinez/jless
* text to tree structure [I use this as a hack to version control my music library] https://github.com/birchb1024/frangipanni
Simple example: (any language, e.g. Rust) rename a function across multiple files and undo it. Let me know how you'd do it in your editor of choice.
Since then, I've been using CIDER on emacs to do Clojure development, and I haven't had any issues.
I don't think I can count on two hands the number of times I have to do that in a year. As for undoing it I don't think I've ever done it at all. Anyway it doesn't matter because vim + CoC can do it. And for undoing it I guess I simply rename it back to the original name. Actually I just tried and yeah, it works.
One of these day I'd like to sit with a JetBrains user and see how they work. I'm sure it's a great IDE but so far I haven't heard about anything life changing.
And worth every penny, for me.
Edit: Not claiming this is better, just saying what I get by with. I have never used an IDE in my career so far, or any autocomplete or code modification features.
You can undo/redo with cmd+z or cmd+shift+z.
replace cmd with ctrl on linux or windows.
Deleted Comment
So, from the technical point of view I would say VSCode is equally good.
What I miss most is the UX. Once you get used to the Jetbrains IDEs, their usability is really awesome.
* turn on the Match whole word and Match case modes,
* review the found occurrences;
* press the Replace button.
https://www.abareplace.com/blog/blog_rename_method/
Disclaimer: I wrote this program.
I've got a git merge/diff wrapper that falls back from p4merge to idea and finally back to stock diff.
If you're not using the refactoring tooling then you won't understand why many people love it so much.
[It's worth looking under the hood at the plugin APIs. The editor doesn't work on text files. It works on ASTs.]
But then I needed proper support for Vue 3, Tailwind and Svelte. VSCode was (is) light-years ahead but what drew me away was how Jetbrains handled the issues. Endless hours writing tickets, creating examples, ... for nothing. Finally, after switching to Linux it turned out that US int. keyboard layouts don't work properly. There's a workaround, but again, the way the support handled the issue was not what I expect from such an expensive service. I was basically told to read through years old long issues to find out how to manually fix it.
That was the day I canceled my subscription.
VSCode is totally up to the job. But somehow I'm still not happy.
Maybe time to try Neovim or Helix (multi LSP needed).
It's (almost) 2023, the way to develop applications is to put a reproducible Docker container with all the dependencies + debug tools you need in the repo, so that anyone can clone it and spin it up in their IDE.
VS Code has amazing support for this, while the only Jetbrains IDE that comes close is CLion.
https://github.com/docker/dev-environments/issues/70
Easily has saved me hundreds of hours so far, being able to view function prototypes quickly, pull up documentation as an overlay on the code, jumping to the next error, and even down to getting simple things like enumerated 'case' labels inside of a switch statement.
And once in a while I'd randomly have to look at some code that is not my primary work language, but everything will just work out of the box. Working with Emacs has never been better.
Huge shoutout to Magit mode, which I dearly love and definitely saved me bunch of time otherwise spent context switching to command line or another UI. 100hr = 6000min, I've been using Magit for 8 years at-least.
Assuming I'm doing some coding at-least 4 days a week, 4days * 4weeks * 12months * 8years = 1536 days of work. Let say it saves me 30 second on average by not switching window, selecting hunk individually that I love doing, doing arbitrary VCS operations (I love looking at diffs and just hitting enter to go to the source), I just need to open it 8 times per day to make it 100 hours so far. Definitely have used more than that I think. But even if this calculation is way off, and I'm not really saving time, its a very pleasant experience that is unmatched if you use Emacs IMO.
jq, perl, grep, gnu textutils, gnu parallel, bash, xargs, gkrellm, nload.
Make deserves a special shout out. If you think it's only useful for building software, you've completely missed the point (similarly, if you think some language-specific tool is superior, you're doing things completely wrong):
Anyway, this document saved me at least 10,000 hours:
https://www.gnu.org/software/make/manual/html_node/index.htm...
Other peoples' python has the distinction of being the only software in my -1000 hours saved category. (And if you consider maintaining code written in the above "write only" languages, you'll realize how big of a feat that is!)
I clicked on your link with 16 pages of just contents links to find what the point is, and found "the make utility automatically determines which pieces of a large program need to be recompiled, and issues commands to recompile them".
What's the point you see?
It takes about an afternoon to set up NFS + SSH primitives that automatically distribute the computation across clusters of machines. Since it is restartable, it automatically tolerates hardware faults (up to dozens of machines, in practice).
Basically, you get Map Reduce, but for arbitrary data processing DAGs, and it supports any language that works well on Unix-style operating systems.
Add xmlstarlet for anything that has to do with xml.
Obligatory Spolsky intro to Excel: https://www.youtube.com/watch?v=0nbkaYsR94c
So useful I like it despite how it always goes out of its way to waste my time by trying to misrepresent a number of different types of strings and numbers as American dates :-|
The ability create a relational database in Excel with vlookups and hlookups, then capture it all into a macro is amazing.
I've really enjoyed using Excel as a Postgres frontend, with a real Postgres DB instance handling data, and then using the report functionality to dump to Word.
While a pro reporting engine and cutting out MS Office altogether would be a better longterm solution, it is hard to beat for quick & dirty results.
Trivia: JMP stands for "John's Macintosh Project".
Also, the entire semiconductor industry depends on JMP just like the entire pharmaceutical industry depends on Minitab.
This isn't specific to JMP of course. A good thing about Excel is that businesses are OK with just paying for "everybody" to have it.
Also, people use Excel for more than analysis. It's also a crude database and platform for creating small "apps" that do things, that are easy to share with others.
Still use Excel for quick stuff but otherwise it's pandas for me.
Excel to the rescue! Took me about five minutes to extract exactly what I needed.
If it's Windows there should be PowerShell ISE installed.
But, given the problem “I have some unfortunately formatted data which I need to analyze”, there is no better solution than sanitizing it in VS Code and then analyzing it in Excel.
DBeaver: use a consistent interface for practically any data store. Wanna SELECT and JOIN CSVs? It can do that too.
https://www.mail-tester.com/ - Fantastic email server settings troubleshooter.
Excel / Calc / Gnumeric: I don't even know macros, just the functions, sorting, filtering, and pivot tables enable good productivity. And sometimes fun, I chose my current video card, and optimized my Factorio gameplay with Calc.
BASH, jq, sed, grep, tr, cut, Geany, regexes: it's fantastic to be able to work with text. Log parsing and other text tasks turn into a puzzle game, where I win fast, and it's usually faster than to use anything else, especially for one-offs.
One thing that blew my mind the first time I saw it, was that when you look at geospatial data, they let you view your geometries on a map. It's so simple and so awesome!
[1] http://www.gnumeric.org/announcements/1.12/gnumeric-1.12.3.h...
Although be warned, it can also have the "side-effect" (functional programming pun!) of making you somewhat insufferable as you try to convince everyone around you that functional programming is amazing.
I ask, because I used to feel very similar about the OO paradigm (it helped me model the world easier, made me insufferable because of my zeal, etc). But, I had the privilege of doing that with nearly 20 years of Smalltalk. A battle worn path of ObjectiveC, Swift, Java, Python, Kotlin, and JavaScript later, I feel the pain. It's like being in forestry, one day you work with a chainsaw, and the next day they give you a fan with spoons welded for the blades.
These days I'm doing some Elixir... and I love it. I don't know how welcome it is in the "functional programming and pure functions" club, but I think it's awesome.
I have a working theory that what has made these paradigms loved or hated, is less about them theirselves, and more about the execution thereof. What made and makes both Smalltalk and Elixir appealing to me is their simplicity and straightforwardness. There's a mechanism you learn to reason about the problems you're trying to solve, and then you can excel at it, instead of constantly stumbling on edge cases where "hybrid" languages try to reconcile all of the paradigms together.
YMMV
In OO (the kind I've seen, and I've not seen Smalltalk, mostly C++), it's common for a member function to just go ahead and modify the member variables it needs to modify. This is considered "good encapsulation," but it's horrid for reading code and likewise horrid for parallelizing anything.
When you take that practice to the logical conclusion, you can end up with a member function like "void update();" (let's pretend that our class is a physics engine and this function presumably takes velocity and time step and increments position). Some early advice I got for writing maintainable code was "assume that whoever is maintaining the code after you is smart and in a hurry," and that sort of code just breaks that advice. If I see that kind of function, I need to dive into it to figure out what's going on. Whereas if I saw "state.position = update_position(state.velocity, state.dt);" I can make an educated guess about what's going on and move on.
I'm making myself a little angry here, so I'll wind down. These are the main points anyway, this sort of functional style feels like it takes something in 4D space where I have to twist my brain into a klein bottle to figure it out and puts it into 2D space where I'm like "oh, that's all there is to it then."
To your working theory, I see what you're saying, but I think I lean towards preferring poorly done functional code as opposed to well done OO code, because the functional code will be easier to test and shape into good code, whereas the OO code might get fragile over time. But let's be honest, it's not like "well done OO code" is an option we expect to have on the table :D
Erlang, and by extension Elixir, are very respected.
The fact that you have a strong background in Smalltalk isn't a surprise: Kay's idea of isolated objects sending methods to each other, independent of each other is OTP. Erlang, IMO, is the most beautiful combination of functional and (Kay's definition of) OOP there is.
As a bonus, you'll be able to write insufferable comments like these in HN threads.
Also: The level of control offered by Rust comes at a steep cost compared to GC'd languages.
Functional programming easily cost me hundreds of hours without much to show for it. Monad transformers, free monads, final tagless... this rabbit hole is very very deep.
No regrets though, would suffer through this again!
I know that with Rust the time-to-robustness is much lower than with Python for example.
Yes, because single letter variables are bad.
> But for some reason, functional programming tends to get a pass, despite it just not clicking for a large swath of team mates.
Perhaps this is a problem with the team mates rather than with functional programming? I'm too dumb for functional programming, but I freely admit it's the superior way of writing software. If we were mathematicians rather than programmers, programming would be way better!
I was at first rushing implementing ~50 business rules (which changed weekly) on the setup of a system. Then this functional wise kid came along and we did in one week what took me 5 weeks.
Along with that, using MQTT to separate your program with Protobuf makes everything so much easier. Program crashes? Let it burn and let systemd restart it. So much easier to test too. Our code coverage is 99% if we exclude the main files that initialize everything.
I haven't touched the Windows Search utility since I found it.
Agent Ransack (free for commercial use) and FileLocator Pro (paid, has near-instant indexed search) are the go to grep alternatives for Windows on my dev team. https://www.mythicsoft.com/
I also hear VS Code has ripgrep built in, but I haven’t used it extensively.
Deleted Comment
As a manager & parent with only occasional bursts of time to code (some work, mostly side/fun stuff), Copilot has turned out to be incredibly useful in smoothing over all of the small things I'm slow at because I don't do them daily. And especially since I have limited time, I just want to get the damn thing working and am quite happy to <Tab> my way there as quickly as possible.
Copilot is the only real value I'm getting from the recent A.I revolution and it does save me hundreds of lines of manully typing code all day. And the best part is it's getting better and better each day.
These are not just novelty value. They're great for mocking up ideas and I've also used them for generating backgrounds for advertising, for example:
"A black stage lit from above by two spotlights, very dramatic, stylish"
You can also add keywords like "modern/rustic/nature/futuristic" and it will get tuned to your desired style immediately.
Iterate on that for 5 minutes or so and there's my perfect background for a "coming soon" flyer. Way better than I could have made in Canva. Good enough that multiple people have told me the flyers look amazing, and nobody guessed it was AI until I told them.
Update: installed it and it seemed to work fine out of the box.